Логика линковщика (немогу понять)

Модератор: Модераторы разделов

Aleman
Сообщения: 109

Логика линковщика

Сообщение Aleman »

Написал Привет мир на "С"

#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
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Логика линковщика

Сообщение sergio »

Aleman писал(а):
24.10.2007 22:38
libc.so.6 => /lib/libc.so.6 (0x00002b09231ff000)
/lib64/ld-linux-x86-64.so.2 (0x00002b0922dd1000)
Вот и озадачиваюсь вопросом. Кто говорит линковщику, где это у него настроено, что именно libc библиотеку нужно эту брать libc.so.6

Скорее всего - компилятор, который в системе GCC линковщик запускает и им управляет. Для си++ кода запуск компилятор д.б. под именем g++ - тогда линковщику указываются другие библиотеки и стартап модули. Попробуйте плюсовый хелловорлд собрать gcc - получите кучу ошибок линковки...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

Хорошо. Пусть компилятор говорит линковщику сувать именно этут библу.
Но где это у него прописано? Вшито чтоли прям в компилятор?
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

Ктонибудь знает? Если допустим я хочу подставить свою библу
Спасибо сказали:
s0urce
Сообщения: 321
ОС: Arch Linux + WinXP

Re: Логика линковщика

Сообщение s0urce »

Пусть компилятор говорит линковщику сувать именно этут библу.
Но где это у него прописано?

Код: Выделить всё

#include <stdio.h>

нужно же ему подключить библиотеки, в которых объявленные функции реализованы...
а libc.so всем С-программам нужна и уж подставлять вместо неё свою библиотеку - странная идея, может лучше сразу свой ЯП напишешь?
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

s0urce писал(а):
26.10.2007 16:22
может лучше сразу свой ЯП напишешь?


Очень остраумно. Моя цель библу обновить.. Бывает такое?
А в stdio.h нет ничего про libc.so.6
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Логика линковщика

Сообщение sergio »

Aleman писал(а):
26.10.2007 16:13
Ктонибудь знает? Если допустим я хочу подставить свою библу

Код: Выделить всё

gcc -L ~/lib -lmoyaliba prog.c

:tongue:

Непонятен вопрос. Свою либу подставить - или вместо стандартной си-либы что-то подпихнуть? Если первое - то показал, какие проблемы? Если второе - то какого извиняюсь? Но если оч надо - то достижимо наверняка... только придется поразбираться, каждый встречный не подскажет, потому как никому оно не надо. :happy:

Aleman писал(а):
26.10.2007 16:27
Моя цель библу обновить.. Бывает такое?


Код: Выделить всё

$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 13 2007-08-17 07:21 /lib/libc.so.6 -> libc-2.3.6.so


Так понятнее???
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

вместо стандартной си-либы

sergio писал(а):
26.10.2007 16:32

Код: Выделить всё

$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 13 2007-08-17 07:21 /lib/libc.so.6 -> libc-2.3.6.so


Так понятнее???


Понятно что libc.so.6 ссылаеться на libc-2.3.6.so и что?
Спасибо сказали:
Аватара пользователя
spi
Сообщения: 10

Re: Логика линковщика

Сообщение spi »

Aleman писал(а):
24.10.2007 22:38
Написал Привет мир на "С"

#include <stdio.h>

int main(void)
{
printf ("Hello World\n");
return 0;
}

Скомпилировал "gcc hw.c"


Если очень надо, то не пиши в коде #include <stdio.h>, а компилируй с параметром -c:
gcc -c hw.c

После этого линкуй объектник с какими угодно либами линковщиком ld.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Логика линковщика

Сообщение sergio »

Aleman писал(а):
26.10.2007 16:35
вместо стандартной си-либы
Понятно что libc.so.6 ссылаеться на libc-2.3.6.so и что?

Ну так что именно вам надо, услышат наконец толком или где?
Обновить стандартную либу? кто мешает?
Подставить в систему вместо стдлиб невесть что?
Для компиляции одной программы заменить линковку с стдлиб на линковку с непойми чем? Что, документация совсем ничего не говорит про управление умолчательными линковками, стратапами и проч? Я как бы не проверял, мне без надобности. Слышал, что в MSVC какие-то маньяки, которым хотелось с чмстым выньапи работая согнать размер файла до нуля - выкидывали стандартную линковку и стартап, получали свою сишную прогу в 500 байт размером... Я не маньяк, я не пробовал. :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
s0urce
Сообщения: 321
ОС: Arch Linux + WinXP

Re: Логика линковщика

Сообщение s0urce »

Понятно что libc.so.6 ссылаеться на libc-2.3.6.so и что?
ну а то, что если очень надо, сделай чтобы ссылалась на твою не пойми откуда взявшуюся либу. man ln тебе в помощь...
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

мда... а я вот не хочу ссылаться.. мне интересно просто .. и никто не знает.. вот загадка линукса
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Логика линковщика

Сообщение Uncle_Theodore »

Aleman писал(а):
26.10.2007 22:39
мда... а я вот не хочу ссылаться.. мне интересно просто .. и никто не знает.. вот загадка линукса

В действительности, сложно понять, чего же это Вы хотите... :)
Например, если Вы не хотите, чтобы gcc линковала с libc и другими дефолтными библиотеками, запускайте компиляцию с опцией
-nodefaultlibs
Вот так, например

Код: Выделить всё

gcc privet.c -nodefaultlibs -o privet

Или вот еще есть опция -nostdlib ...
Спасибо сказали:
s0urce
Сообщения: 321
ОС: Arch Linux + WinXP

Re: Логика линковщика

Сообщение s0urce »

мда... а я вот не хочу ссылаться.. мне интересно просто .. и никто не знает.. вот загадка линукса

мда... оказывается загадка линукса состоит в том, чтобы узнать что от нас хочет Aleman... и никто ведь не знает... включая его самого похоже.
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

s0urce писал(а):
27.10.2007 01:08
мда... оказывается загадка линукса состоит в том, чтобы узнать что от нас хочет Aleman... и никто ведь не знает... включая его самого похоже.


Кто сидит на WINXP меня конечно не поймет.

Uncle_Theodore, Спасибо большое!
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

вот что получаеться:

aleman@aleman-desktop:/media/sdb5/test$ gcc hw.c -nodefaultlibs
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x12): undefined reference to `__libc_csu_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccSfdUuE.o: In function `main':
hw.c:(.text+0xa): undefined reference to `puts'
collect2: выполнение ld завершилось с кодом возврата 1
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Логика линковщика

Сообщение Uncle_Theodore »

Aleman писал(а):
28.10.2007 22:33
вот что получаеться:

aleman@aleman-desktop:/media/sdb5/test$ gcc hw.c -nodefaultlibs
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x12): undefined reference to `__libc_csu_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccSfdUuE.o: In function `main':
hw.c:(.text+0xa): undefined reference to `puts'
collect2: выполнение ld завершилось с кодом возврата 1


Так это и должно получаться.
Опция отключает линковку со стандартными библиотеками, но Вы-то должны подставить свои библиотеки, в которых определены те же базисные функции. Совсем-то без библиотек скомпилировать не удастся.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Логика линковщика

Сообщение sergio »

Aleman писал(а):
28.10.2007 22:33
вот что получаеться:

aleman@aleman-desktop:/media/sdb5/test$ gcc hw.c -nodefaultlibs
/usr/lib/gcc/x86_64-linux-gnu/4.1.3/../../../../lib/crt1.o: In function `_start':
(.text+0x12): undefined reference to `__libc_csu_fini'

Это и есть процедуры стартапа/файнализации. Все то, что выполняется до входа в мэйн и после выхода из, а также exit, at exit, и проч. Реально точка входа в выполнимый файл не с мэйн же связывается, а со всей этой оберткой (которая отчасти вроде как библиотека, но реально скорее core C ).
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Aleman
Сообщения: 109

Re: Логика линковщика

Сообщение Aleman »

все понятно.
Спасибо сказали: