Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.0.89] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Написал Привет мир на "С"
#include <stdio.h> int main(void) { printf ("Hello World\n"); return 0; } Скомпилировал "gcc hw.c" Смотрим на использумые библиотеки "ldd a.out" Увидел: libc.so.6 => /lib/libc.so.6 (0x00002b09231ff000) /lib64/ld-linux-x86-64.so.2 (0x00002b0922dd1000) Вот и озадачиваюсь вопросом. Кто говорит линковщику, где это у него настроено, что именно libc библиотеку нужно эту брать libc.so.6 |
Сообщ.
#2
,
|
|
|
LIBC это C Runtime - она по умолчанию всегда подключается.
|
Сообщ.
#3
,
|
|
|
Я понял что по умолчанию всегда включаеться. Но почему именно эта версия.
Если я хочу другую подставить.. как это сделать? |
Сообщ.
#4
,
|
|
|
Цитата Aleman @ Если я хочу другую подставить.. как это сделать? Я сейчас точно не помню, посмотри параметры линкера. Должна быть опция --nodefaultlib или что-то в таком духе - т.е. линковать без библиотек по умолчанию. А в командной строке укажеш ту которую хочеш подключить. Только если ты функции из LIBC используеш (а ты скорее всего используеш) - то какую-нибудь версию всё равно подключать прийдётся. Если сам не найдёш - выложи тут список опций линкера, я на память не помню... |
Сообщ.
#5
,
|
|
|
Хорошо. Спасибо. Пороем.
Всетаки это вшито в линкер при сборке чтоли |
Сообщ.
#6
,
|
|
|
У gcc есть скрипт компиляции (specs file). В частности, в нем указано, какие либы по умолчанию вкомпиливать, и т.д.
Посмотреть дефолтовый specs file можно, вызвав gcc -dumpspecs. Где хранится specs file, я не помню. Важно понимать, как устроен gcc: есть главная программ gcc (она называется driver, т.е., ведущий). Эта программа использует specs и опции командной строки, чтобы определить, какие шаги сборки и каким образом выполнить (препроцессинг, компиляция, линковка). Т.е., в простейшем случае (для сборки helloworld) gcc сначала запускает препроцессор, потом компилятор (cc1 или cc1plus), потом линковщик. С каким параметрами их запускать, определяется исходя из скрипта и опций командной строки. |
Сообщ.
#7
,
|
|
|
Цитата mo3r @ есть главная программ gcc (она называется driver, т.е., ведущий) Меня всегда смущал такой ньюанс . archimed7592@PC ~/testlabs/g++ $ cat main.cpp #include <ostream> #include <iostream> int main() { std::cout << "Hello world!" << std::endl; return 0; } archimed7592@PC ~/testlabs/g++ $ g++ ./main.cpp archimed7592@PC ~/testlabs/g++ $ gcc ./main.cpp C:/Temp/ccIlbaaa.o(.text+0xd):main.cpp: undefined reference to `std::string::size() const' C:/Temp/ccIlbaaa.o(.text+0x60):main.cpp: undefined reference to `std::string::operator[](unsigned int) const' C:/Temp/ccIlbaaa.o(.text+0x9f):main.cpp: undefined reference to `std::string::operator[](unsigned int) const' C:/Temp/ccIlbaaa.o(.text+0xce):main.cpp: undefined reference to `std::string::operator[](unsigned int) const' C:/Temp/ccIlbaaa.o(.text+0x135):main.cpp: undefined reference to `std::cout' C:/Temp/ccIlbaaa.o(.text+0x13a):main.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' C:/Temp/ccIlbaaa.o(.text+0x142):main.cpp: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' C:/Temp/ccIlbaaa.o(.text+0x14a):main.cpp: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' C:/Temp/ccIlbaaa.o(.text+0x173):main.cpp: undefined reference to `std::ios_base::Init::Init()' C:/Temp/ccIlbaaa.o(.text+0x18e):main.cpp: undefined reference to `std::ios_base::Init::~Init()' collect2: ld returned 1 exit status archimed7592@PC ~/testlabs/g++ $ |
Сообщ.
#8
,
|
|
|
Цитата Меня всегда смущал такой ньюанс . А если так, то соберется: gcc main.cpp -lstdc++ Как я понимаю, gcc и g++ используют различные профили компилятора, которые подключают разные библиотеки. |
Сообщ.
#9
,
|
|
|
aleman@aleman-desktop:~$ gcc -dumpspecs *asm: --traditional-format %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{m32:--32} %{m64:--64} *asm_debug: %{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} *asm_final: *asm_options: %a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} *invoke_as: %{!S:-o %|.s | as %(asm_options) %|.s %A } *cpp: %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} *cpp_options: %(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w} %{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*} %{undef} %{save-temps:-fpch-preprocess} *cpp_debug_options: %{d*} *cpp_unique_options: %{C|CC:%{!E:%eGCC does not support -C or -CC without -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{fmudflap:-D_MUDFLAP -include mf-runtime.h} %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h} %{E|M|MM:%W{o*}} *trad_capable_cpp: cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} *cc1: %(cc1_cpu) %{profile:-p} *cc1_options: %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %(ssp_default) %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants} %{coverage:-fprofile-arcs -ftest-coverage} *cc1plus: *link_gcc_c_sequence: %{static:--start-group} %G %L %{static:--end-group}%{!static:%G} *link_ssp: %{fstack-protector:} *ssp_default: %{!fno-stack-protector:-fstack-protector} *endfile: %{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s *link: %{!static:--eh-frame-hdr} %{!m32:-m elf_x86_64} %{m32:-m elf_i386} --hash-style=both %{shared:-shared} %{!shared: %{!static: %{rdynamic:-export-dynamic} %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} %{static:-static}} *lib: %{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}} *mfwrap: %{static: %{fmudflap|fmudflapth: --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc --wrap=mmap --wrap=munmap --wrap=alloca} %{fmudflapth: --wrap=pthread_create}} %{fmudflap|fmudflapth: --wrap=main} *mflib: %{fmudflap|fmudflapth: -export-dynamic} *libgcc: %{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared-libgcc:-lgcc --as-needed -lgcc_s --no-as-needed}%{shared-libgcc:-lgcc_s%{!shared: -lgcc}}}} *startfile: %{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} *switches_need_spaces: *cross_compile: 0 *version: 4.1.3 *multilib: . !m64 !m32;64:../lib m64 !m32;32:../lib32 !m64 m32; *multilib_defaults: m64 *multilib_extra: *multilib_matches: m64 m64;m32 m32; *multilib_exclusions: *multilib_options: m64/m32 *linker: collect2 *link_libgcc: %D *md_exec_prefix: *md_startfile_prefix: *md_startfile_prefix_1: *startfile_prefix_spec: *sysroot_spec: --sysroot=%R *sysroot_suffix_spec: *sysroot_hdrs_suffix_spec: *cc1_cpu: %{!mtune*: %{m386:mtune=i386 %n`-m386' is deprecated. Use `-march=i386' or `-mtune=i386' instead. } %{m486:-mtune=i486 %n`-m486' is deprecated. Use `-march=i486' or `-mtune=i486' instead. } %{mpentium:-mtune=pentium %n`-mpentium' is deprecated. Use `-march=pentium' or `-mtune=pentium' instead. } %{mpentiumpro:-mtune=pentiumpro %n`-mpentiumpro' is deprecated. Use `-march=pentiumpro' or `-mtune=pentiumpro' instead. } %{mcpu=*:-mtune=%* %n`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead. }} %<mcpu=* %{mintel-syntax:-masm=intel %n`-mintel-syntax' is deprecated. Use `-masm=intel' instead. } %{mno-intel-syntax:-masm=att %n`-mno-intel-syntax' is deprecated. Use `-masm=att' instead. } *link_command: %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %{pie:-pie} %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(mfwrap) %(link_libgcc) %o %(mflib) %{fprofile-arcs|fprofile-generate|coverage:-lgcov} %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} Чет невижу тут libc.so.6 |
Сообщ.
#10
,
|
|
|
Цитата *lib: %{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}} -lc и есть libc. А уж libc.so.6 выбирается, наверное, из символических ссылок. |
Сообщ.
#11
,
|
|
|
Посмотрю сегодня...
|
Сообщ.
#12
,
|
|
|
посмотрел...
Цитата mo3r @ -lc и есть libc. А уж libc.so.6 выбирается, наверное, из символических ссылок. сама libc.so лежит в /usr/lib самое интересное она не являеться ни ссылкой ни библеотекой.. в ней обычный текст: /* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf64-x86-64) GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-x86-64.so.2 ) ) Менял libc.so.6 на другую.. всеравно libc.so.6 подставляет. |
Сообщ.
#13
,
|
|
|
что скажете?
|
Сообщ.
#14
,
|
|
|
Я не уверен насчет этого, но, возможно, кроме редактирования этого скрипта надо еще делать ldconfig для обновления кэша линковщика.
Добавлено Цитата mo3r @ надо еще делать ldconfig для обновления кэша линковщика. Только поаккуратней с этим — если неправильно что-то сделать, то может случиться так, что ни одна программа, использующая libc, не запустится. Мне кажется, более продуктивным будет заменить specs. Например, gcc --specs=<specs file>. В любом случае, надо будет читать документацию. |
Сообщ.
#15
,
|
|
|
спасибо.. пороем...
|