collect2 to the rescue

Valamiért át akartam adni a gcc által hívott collect2-nek a --save-temps opciót. De sikerült?!
Igen, elannyira, hogy ő maga is továbbadta a ld-nek, aki joggal mondta rá, hogy
ld: unrecognized option '--save-temps'

$ g++ -Wl,--save-temps -g -shared -m64 -o libB.so -fPIC -DPIC libB.cpp
ld: unrecognized option '--save-temps'

Lett egy ilyen: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118803

Hozzászólások

Nem az az elvárt, hogy a -Wl,-el eljusson az ld-ig az opció?

Igen, de mivel a collect2 beékelődik a gcc és a ld közé, kellene legyen egy mód arra, hogy eljusson az opció a collect2-höz, de ne passzolja tovább a ld-nek.

Tkp. arról van szó, hogy a collect2 messze nem triviális dolgot csinál, amit jó lenne debuggolni.

A `gcc`-nek is van egy ilyen opciója, amit elfogad -save-temps vagy --save-temps formában. A `collect2` csak a --save-temps formát ismeri, azt viszont tovább is adja a `ld`-nek.

$ g++ -save-temps -g -shared -m64 -o libB.so -fPIC -DPIC libB.cpp
$ g++ --save-temps -g -shared -m64 -o libB.so -fPIC -DPIC libB.cpp
$ g++ -Wl,-save-temps -g -shared -m64 -o libB.so -fPIC -DPIC libB.cpp
/usr/local/x86_64-pc-linux-gnu/bin/ld: Error: unable to disambiguate: -save-temps (did you mean --save-temps ?)
collect2: error: ld returned 1 exit status
$ g++ -Wl,--save-temps -g -shared -m64 -o libB.so -fPIC -DPIC libB.cpp
/usr/local/x86_64-pc-linux-gnu/bin/ld: unrecognized option '--save-temps'

No, találtam egy COLLECT_GCC_OPTION nevű enviro-t, ha abba betesszük, hogy -save-temps vagy --save-temps, akkor... szintén nem történik semmi változás.

$ grep 'cdtor' strace.log
[pid 49481] open("/tmp/ccb38lZo.cdtor.c", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
[pid 49481] lstat("/tmp/ccb38lZo.cdtor.c", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
[pid 49481] unlink("/tmp/ccb38lZo.cdtor.c") = 0

Említsük meg, hogy a collect2 létre sem jött volna, ha nincs a GYBAJUNK C++. Köszönjük, Strupstrup úr.

Én azt nem értem, hogy egy natúr C kód fordításához miért akar C++ eszközöket igénybe venni? Hát arra ott a G++, nem? 

Szerk, hülye vagyok, ez egy C++ kód. Felületesen olvastam el.

Nem tudod valahogy kézzel végigzongorázni, amit a g++ csinál? 

Szerk2: elolvastam a Bugzillára adott válaszokat. Az az ember ezeket képes volt tényleg beírni, és nem röhögte el magát/csapott a fejére, hogy ez így szar működés? Mármint, akkor nem generálok temp fájlokat, ha az a kapcsolóm, hogy generáljak?! Hol logikus ez???!!!

Blog | @hron84

valahol egy üzemeltetőmaci most mérgesen toppant a lábával 

via @snq-

Meggyónták (a hibabejelentésre válaszul), hogy ELF-platformon csak egy üres fájl készül, és az is csak akkor, ha nem használjuk a save-temps opciót (amit a gcc-nek megadni, tehát -Wl prefix nélkül). Magamtól is kitalálhattam volna, elnézést kérek.

Bár van a válaszban egy olyan rész, hogy "hát igen, az üres fájl felesleges létrehozását ki lehetne hagyni"

Így utólag bevallhatom, hogy ezt a problémát akartam volna vizsgálni:
https://stackoverflow.com/questions/79411453/issue-in-static-variables-…
Nyilván amit akar, az fasság; nyilván reentráns kódot kellene alkotnia tákolás helyett; valamint mindenki tudja, hogy a C++ nem működik jól együtt a $X-szel (esetünkben a X=dinamikus betöltés); de ettől még lehetne vizsgálni, hogy a gcc és a clang miért ad különböző eredményt. (Valamint említsük meg, hogy Aix-on a gcc más eredményt ad, mint Linuxon.)