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