Ha nem az objektet adunk a linkernek, hanem egy *.a könyvtárat, és abban a 'felesleges' objektet, akkor az eredmény különböző lesz AIX-en és linuxon:
linux$ ./collect2_prob_a
A főprogram vagyok, semmi különös
AIX$ ./collect2_prob_a
HibaProvokalo: Nekem qrvára nem kellene futnom
A főprogram vagyok, semmi különös
Hátravan még az a kérdés, hogy hátha azért van ez, mert maga AIX-os ld belegyógyítja a teljes *.a archívot az executable-ba.
De nem. Ha veszem azt a parancsot, amit a collect2 dob a ld-nek, akkor ezt kapom:
$ make ./collect2_prob_ald
/usr/bin/ld -bpT:0x10000000 -bpD:0x20000000 -btextro -bnodelcsect \
-o collect2_prob_ald /lib/crt0.o -L/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.4 -L/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.4/../../.. collect2_main.o collect2_bait.a \
-lstdc++ -lm -lgcc_s \
/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.4/libgcc.a \
-lc -lgcc_s \
/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.6.4/libgcc.a
$ ./collect2_prob_ald
A főprogram vagyok, semmi különös
látszik, hogy nem ugrott rá a collect2_bait.a-ra, nem nem volt rá szüksége, nem volt unresolved externje.
- NevemTeve blogja
- A hozzászóláshoz be kell jelentkezni
- 1029 megtekintés
Hozzászólások
Mondjuk a reprodukalashoz kellene a collect2_bait.a -ban levo class kodja...
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:
()=()
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()
- A hozzászóláshoz be kell jelentkezni
/* collect2_bait.cc */
#include <cstdio>
class HibaProvokalo {
public:
HibaProvokalo ();
};
HibaProvokalo::HibaProvokalo ()
{
fprintf (stderr, "HibaProvokalo: Nekem qrvára nem kellene futnom\n");
fflush (stderr);
}
HibaProvokalo hp;
Csak két feltétel van:
1. semmi köze se legyen a főprogramhoz
2. legyen benne egy globális változó, aminek a konstruktora le kell fusson még a main előtt
- A hozzászóláshoz be kell jelentkezni
Tudod mi a rettenetesen nfurcsa? Hogy meg -Wl,--as-needed flaggal egyutt is lefut a konstruktor. Mert hogy normalban lefut, azt meg lenyelem. De igy... :o
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:
()=()
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()
- A hozzászóláshoz be kell jelentkezni
Ez pontosan milyen OS, melyik változat (main.o+bait.o vagy main.o+bait.a vagy egyéb)?
- A hozzászóláshoz be kell jelentkezni
Linux, de a konkret valtozatot csak hetfon tudom megmondani, mert megbolondult a gepem, es nem ferek hozza a munkahelyi gephez itthonrol (nem indul a VPN vmiert). Ha minden igaz, akkor a main.o + bait.o verzio csinalja, a main.o + bait.a nem csinalja.
Az a lenyeg, hogy az --as-needed flagnak semmi hatasa nincs, pedig a main.o + bait.o verzioban is ki kellene csapkodnia azokat a szimbolumokat, amikre nem hivatkozik senki.
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:
()=()
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()
- A hozzászóláshoz be kell jelentkezni
Ha effektív megadunk egy *.o -t a linkernek, azt általában beleteszi az eredménybe (persze ez is lehet platform/opciófüggő), az *.a nál viszont mazsolázni szokott a linker, hacsak nincs valami --whole-archive szerű opció (AIX-on például úgy szokunk shared libet csinálni, hogy előtte egy export listát csinálunk az összes input-elem exportált szimbólumából, és átadjuk a ld-nek (-bE:filenev), hogy 'na ezeket szeretnénk az outputban viszontlátni), így bele kell tennie mindent.)
- A hozzászóláshoz be kell jelentkezni
Related: xlc -qtwolink
Olvasmány: https://gcc.gnu.org/onlinedocs/gccint/Initialization.html
És: https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gccint.pdf
Már 2004-ben is szóvátette valaki: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=17480
- A hozzászóláshoz be kell jelentkezni