2016-07-07 10 views
0

Es geht um GNU Linker.Wie platziert man ein Symbol an einer bestimmten Adresse durch das Linker-Skript?

Ich habe eine (sagen wir mal) Variable namens myVar. Jetzt möchte ich, dass meine Variable an einer bestimmten Adresse im Speicher abgelegt wird.

Der Compiler, den ich verwende, hat eine __attribute__ ((blablabla)), die den Trick macht. Ich entscheide mich jedoch für das Linker-Skript.

Da jetzt konnte ich die Variable an bestimmten Adresse aus dem Linker Skript wie folgt einfach platzieren:

myVar = 0xDEAD; 

Und es funktioniert tatsächlich. Das Problem ist, dass der Linker dumm ist und gelegentlich andere Variablen über meine Adresse verteilt. Und beide verhalten sich so, als wären sie in einer union.

Ich denke, dass ich irgendwie dem Linker sagen muss, dass diese Adresse mit dieser Länge besetzt ist und nicht berührt werden sollte.

Wie auch immer, ich schätze, Sie bekommen die Idee. Irgendeine Hilfe?

+0

Solche paraibles sind für Peripheriemodule in OS oder blankem typischerweise verwendet -Metall eingebetteter Code. Der richtige Ort für sie ist in einer Kopfzeile mit Makros. In einer Linkerdatei ist der von ihnen belegte Adressraum für reguläre Variablen nicht verfügbar. Mit dem grundsätzlichen Systemdesign ist also etwas nicht in Ordnung. Sehen Sie [ask] und stellen Sie [mcve] bereit. – Olaf

+0

Was meinst du mit regulären Variablen? – Hairi

+0

Variablen, die vom Compiler & Linker verwaltet werden, nicht Ihre absoluten Adressen. – Olaf

Antwort

2

Ich würde beginnen, c Quelle und Linker zusammenführen.

einen neuen Abschnitt in Linker-Skript definieren, wie:

MEMORY 
{ 
    ... 
    my_data  (rwx) : ORIGIN = your_start_addr, LENGTH = section_length 
} 

SECTIONS 
{ 
    /* ... */ 

    .myVarSection section_address : 
    { 
    KEEP(*(.mySection)) 
    } > my_data 

    /* ... */ 
} 

Dann können Sie Ihre Variable in Quelldatei wie definieren:

uint16_t __attribute__((section (".mySection"))) myVar = 0xDEAD; 
+0

Möchten Sie für jede absolute Variable einen eigenen Bereich einrichten? – Olaf

+0

@Olaf Es scheint, dass OP versucht, eine solche "End-of-Something" -Schwelle zu erreichen. Sicherlich keine meiner Lösungen, um viele Variablen unter verschiedenen absoluten Adressen zu definieren. – LPs

+0

Deshalb habe ich nach einem MCVE gefragt. Die Frage ist nicht sehr klar. Es hat die Haut-Gicht eines XY-Problems. – Olaf