[OSy] Odevzdani 3. zakladniho zadani
Ersin
ersin at post.cz
Tue Jan 20 02:29:48 CET 2009
Dobre vecer,
Poslednich par hodin jsem venoval stejnemu problemu, tak si prisadim se svou troskou do mlyna a pokusim se problem popsat cely a konkretne.
Idea je samozrejme jasna - zkompilujeme vsechny soubory, vyrobime z nich archiv a ten pote slinkujeme se zkompilovanym testem. Linker zajisti, aby se vstupni sekce nachazela na vhodne adrese.
Prvni otazka je jak vyrobit archiv. Nabizi se opet pouzit linker, to ale neni mozne. Linker vyzaduje existenci vsech symbolu definovanych (jako externi) v objektovych souborech. Vzhledem k tomu, ze funkce main je dekladrovana v librt.h, (pravdepodobne) volana z nejakeho souboru a jeji implementace (v dobe vytvareni librt.a) neni k dispozici, neni mozne pouzit linker k vytvoreni librt.a.
Knihovnu librt.a proto (jak bylo receno) vytvorime pomoci utility ar. Nastrojem objdump jsme se ujistili, ze v librt.a je definovana nase vstupni sekce (napriklad .excvec z Kalista). Stejne tak je dobre se ujistit, ze librt.a opravdu obsahuje vsechny naprogramovane funkce a symboly.
Prichazi hlavni krok, slikovani knihovny (librt.a) a testu (test.o). Rekl bych, ze na tomto kroku jsme se vsichni zarazili. Vysledek (user.raw) jsem kontroloval pomoci objdump - a (pokud pouzijeme linker skript z Kalista) nase sekce .excvec proste zmizela, ve vyslednem user.raw nebyla. A nejen ta - s ni taky polovina dalsich funkci. Zkratka vsechno, co neni primo volane z aktualniho testu. Jakoby linker dospel k zaveru, ze ktery symbol neni odkazovany z ostatniho kodu, ten neni potreba.
Po dlouhem hrani jsem zjistil, ze linker se domniva, ze sekce .excvec vubec neni ve vstupnich souborech obsazena. Pritom objdump tvrdil, ze symbol je definovany v knihovne librt.a, kterou dostal linker jako vstup.
V linker skriptu jsem mel pro jistou vystupni sekci zkopirovanou z Kalista nasledujici vstupni sekci:
* (.excvec)
Ona hvezdicka na zacatku oznacuje vsechny vstupni soubory. Nahradil jsem nahodou hvezdicku za jmeno konkretniho souboru (rekneme head.o), ve kterem je sekce obsazena - a vse zacalo fungovat. Vysledek tedy vypada asi takto:
head.o (.excvec)
Domnivam se proto, ze linker se opravdu chova pri linkovani klihovny s danym linker skriptem velice zvlastne. Hvezdicku asi povazuje za vsechny vstupni soubory (tedy librt.a a test.o), ale prislusne sekce se zrejme nachazeji v souborech, ktere jsou soucasti knihovny. Proto na hvezdicku nenasel zadnou vstupni sekci .excvec.
Doufam, ze se moc nepletu, dobrou noc vsem.
Stanislav Kozina
More information about the NSWI004
mailing list