На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Логика линковщика , Не могу понять
    Написал Привет мир на "С"

    ExpandedWrap disabled
      #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
      LIBC это C Runtime - она по умолчанию всегда подключается.
        Я понял что по умолчанию всегда включаеться. Но почему именно эта версия.
        Если я хочу другую подставить.. как это сделать?
          Цитата Aleman @
          Если я хочу другую подставить.. как это сделать?

          Я сейчас точно не помню, посмотри параметры линкера.
          Должна быть опция --nodefaultlib или что-то в таком духе - т.е. линковать без библиотек по умолчанию.
          А в командной строке укажеш ту которую хочеш подключить.
          Только если ты функции из LIBC используеш (а ты скорее всего используеш) - то какую-нибудь версию всё равно подключать прийдётся.
          Если сам не найдёш - выложи тут список опций линкера, я на память не помню...
            Хорошо. Спасибо. Пороем.
            Всетаки это вшито в линкер при сборке чтоли <_<
              У gcc есть скрипт компиляции (specs file). В частности, в нем указано, какие либы по умолчанию вкомпиливать, и т.д.
              Посмотреть дефолтовый specs file можно, вызвав gcc -dumpspecs. Где хранится specs file, я не помню.
              Важно понимать, как устроен gcc: есть главная программ gcc (она называется driver, т.е., ведущий). Эта программа использует specs и опции командной строки, чтобы определить, какие шаги сборки и каким образом выполнить (препроцессинг, компиляция, линковка). Т.е., в простейшем случае (для сборки helloworld) gcc сначала запускает препроцессор, потом компилятор (cc1 или cc1plus), потом линковщик. С каким параметрами их запускать, определяется исходя из скрипта и опций командной строки.
                Цитата mo3r @
                есть главная программ gcc (она называется driver, т.е., ведущий)

                Меня всегда смущал такой ньюанс :).
                ExpandedWrap disabled
                  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++
                  $
                  Цитата
                  Меня всегда смущал такой ньюанс :).

                  А если так, то соберется:
                  ExpandedWrap disabled
                    gcc main.cpp -lstdc++

                  Как я понимаю, gcc и g++ используют различные профили компилятора, которые подключают разные библиотеки.
                    ExpandedWrap disabled
                      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
                      Цитата
                      *lib:
                      %{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}

                      -lc и есть libc. А уж libc.so.6 выбирается, наверное, из символических ссылок.
                        Посмотрю сегодня...
                          посмотрел...

                          Цитата mo3r @
                          -lc и есть libc. А уж libc.so.6 выбирается, наверное, из символических ссылок.

                          сама libc.so лежит в /usr/lib
                          самое интересное она не являеться ни ссылкой ни библеотекой.. в ней обычный текст:

                          ExpandedWrap disabled
                            /* 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 подставляет.
                            что скажете?
                              Я не уверен насчет этого, но, возможно, кроме редактирования этого скрипта надо еще делать ldconfig для обновления кэша линковщика.

                              Добавлено
                              Цитата mo3r @
                              надо еще делать ldconfig для обновления кэша линковщика.

                              Только поаккуратней с этим — если неправильно что-то сделать, то может случиться так, что ни одна программа, использующая libc, не запустится.

                              Мне кажется, более продуктивным будет заменить specs. Например, gcc --specs=<specs file>.

                              В любом случае, надо будет читать документацию.
                                спасибо.. пороем... ;)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0403 ]   [ 15 queries used ]   [ Generated: 17.05.24, 08:01 GMT ]