jak dat procedure abs.adresu v C v Yagarto?

Milan B. milan na bastl.sk
Úterý Prosinec 7 02:35:40 CET 2010


> Takze pri nejakych zlozitejsich problemocch je potrebne sa ponorit do linker scriptu, a to nie je uplne trivialne.
>
Je to trivialne. Linker skript patri medzi tie jednoduchsie veci.

> GNU linker je bohuzial nie najlepsie zdokumentovany a je v nom vela sedivych miest, ktore sa naviac v case (s roznymi verziami binutils) tak trocha menia :-(
>
Je zdokumentovany viac ako dostatocne, dokumentacia je jednoducha a 
prehladna. Vola sa "The GNU linker" a cely popis linker skriptu od 
jednoduchsiemu k zlozitejsiemu s mnohymi prikladmi zabera celych 37 
stran, zvysok tejto 116-stranovej dokumentacie je popis prepinacov a 
specifika pre rozne platformy. Takze - ako som povedal - linker skripty 
patria medzi tie jednoduchsie veci.

"Sedive miesta" su len tam, kde sa niekto pokusa sponovat veci na doraz, 
snaziac sa interpretovat jednotlive casti po svojom, pripadne pouzivat 
riesenia najdene na Google, ktore niekomu fungovali v minulosti, napriek 
tomu ze ich pouzitie dokumentacia nezmienuje, pripadne od nich odradza. 
Taketo vlastnosti sa volaju "nedokumentovane vlastnosti" a autori 
programu maju pravo taketo vlastnosti upravovat a odstranovat, a ten kto 
ich pouziva ma pravo sa cudovat, ale nema pravo sa stazovat. Medzi 
taketo typicky patri aj pouzivanie rozsirujucich  linker skriptov k 
preddefinovanym skriptom (bez parametra -T).

Takze najjednoduchsi postup za 2 minuty:
- zobrat linker skript, ktory sa pouziva (parameter -verbose (alebo 
-Wl,-verbose pre gcc) prezradi, ktory sa pouziva alebo ako vyzera)
- upravit cast oznacenu "MEMORY" a pridat do nej vlastny region pamati 
(napr. myloader)
- pridat popis sekcie do casti SECTIONS, napriklad   ".myloader : { 
*(.myloader) } > myloader" (to znamena: zober sekcie .myloader zo 
vsetkych  .o suborov, skombinuj ich do jednej sekcie .myloader vo 
finalnom programe  a umiestni ju do oblasti pamate myloader)
- kazdu funkciu, pripadne konstantu strcit zmienenym sposobom do sekcie 
.myloader
- pouzit uraveny skript pri linkovani s parametrom -T  (kompletne sa 
nahradi preddefiniovany skript tym nasim)

Samozrejme, to neriesi inicializaciu premennych v RAM, ako bolo 
zmienene, ale postup je naznaceny v dokumentacii (aj s prikladom) v 
kapitole 3.5.4 na strane 47 dole (pre verziu 2.20.1).

Je dobre si vygenerovat pri linkovani mapu (parameter -Map=outt.map 
pripadne -Wl,-Map=out.map) a pozriet sa, ako vysledok vyzera.

Takze netreba sa nechat vyplasit a znechutit. Je to jednoduche.



-m-


Další informace o konferenci Hw-list