|
|
ru.unix- RU.UNIX ---------------------------------------------------------------------- From : Valentin Nechayev 2:5020/400 29 Dec 2000 16:47:52 To : Alex Korchmar Subject : Re: научите пользоваться g++ --------------------------------------------------------------------------------
Hello Alex Korchmar!
AK> В процессе ковыряния с некоторой программой обнаружился неприятный
AK> момент - я как-то не очень понимаю, откуда g++ берет библиотеки, с которыми
AK> линкует бинарник и, главное - как ему об'яснить, что мне нужны другие?
AK> gcc берет все из spec'а - но вот откуда берется libstdc++ ?
AK> (основное, чего ради я трахаюсь - очень хотелось бы отучить
AK> эту тварь линковаться динамически с чем-нибудь асболютно бредовым, типа
AK> libstdc++-libc6-2.2.9.9.9876.so, расплодившимся в последних версиях
AK> линукса.)
Что ж, проводим диагностику. (Аж самому понравилось;))
netch@sleipnir:~/gppt>ldd gppt
libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2
(0x40018000)
libm.so.6 => /lib/libm.so.6 (0x4005a000)
libc.so.6 => /lib/libc.so.6 (0x40077000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Поставил вместо /usr/bin/ld скрипт, который
печатает параметры и вызывает реальный ld, и получил:
netch@sleipnir:~/gppt>make
g++ -c main.cc -o main.o
g++ -o gppt main.o
ld args: -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o gppt /usr/lib/crt1.o
/usr/lib/crti.o /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtbegin.o -L/us
r/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66 -L/usr/i386-redhat-linux/lib main.o
-lstdc++ -lm -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cr
tend.o /usr/lib/crtn.o
и в списке -L каталогов, libstdc++ найдена в первом:
root@sleipnir:/usr/bin#ls /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66
SYSCALLS.c.X collect2 crtbeginS.o include libstdc++.a
cc1 cpp crtend.o libgcc.a libstdc++.so
cc1plus crtbegin.o crtendS.o libgcc.map specs
Далее,
root@sleipnir:/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66#file libstdc++*
libstdc++.a: symbolic link to ../../../libstdc++-libc6.1-1.a.2
libstdc++.so: symbolic link to ../../../libstdc++-libc6.1-1.so.2
Понятно, что ../../../ относительно этого каталога есть /usr/lib.
Вывод - ld подбирает симлинк и втыкает в бинарник то имя, на которое
показывает симлинк. Подтверждение:
netch@sleipnir:~/gppt>strings gppt | grep libstdc++
libstdc++-libc6.1-1.so.2
Это все при:
root@sleipnir:/usr/bin#rpm -qf
/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/libstdc++.so
egcs-c++-1.1.2-24
netch@sleipnir:~/gppt>rpm -qa | grep egcs
egcs-1.1.2-24
egcs-c++-1.1.2-24
netch@sleipnir:~/gppt>cat /etc/redhat-release
Red Hat Linux release 6.1 (Cartman)
(хотя куча пакетов проапгрейжена)
Hа седьмом редхате я не тестировал, но уверен, что тот же метод тестирования
пройдет и там ;) Или снять с него показания?
P.S. В процессе получил странный эффект - при стандартном для редхата
назначении руту alias rm='rm -i', при rm из
root@sleipnir:/usr/bin#rpm -qf /bin/rm
fileutils-4.0-8
никакие ответы y или yes не помогают.
/netch
--- ifmail v.2.15dev5
* Origin: Lucky Netch Incorporated (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix/913802fe3784.html, оценка из 5, голосов 10
|