Вопросы про линковку

ppplva

1. может ли .so использоваться для статической линковки ? т.е. могут ли символы из него попасть в собираемый бинарник ( кроме как Undefined ) ?
2. если есть .so и .a, который из них используется, если в опциях компилятора явно не указан вид линковки ?
3. как заставить компилятор написать, какие именно либы он использует ?

sergey_m

может ли .so использоваться для статической линковки ?

не может
если есть .so и .a, который из них используется, если в опциях компилятора явно не указан вид линковки ?

В GNU по умолчанию динамический. Думаю, у остальных так же.
как заставить компилятор написать, какие именно либы он использует ?

Он использует только те, которые ты указал ему как -llib.
Узнать какие библиотеки используются уже готовым динамическим бинарником можно с помощью команды ldd.

abrek

> не может
а что мешает кстати? и есть ли где понятная дока, а то я совсем не понимаю в этих вопросах?

sergey_m

Однажды в fido7.ru.unix.prog обсужался вопрос возможности изготовления динамической библиотеки из статической. Отцы пришли к мнению что это теоретически возможно, но
требует долгого хакинга и не дюжинных знаний. А практически нельзя.
Ты поищи в groups.google.com этот тред, кажись там были ссылки.

abrek

> обсужался вопрос возможности изготовления динамической библиотеки из статической.
в смысле наоборот?

bobking

Если статическая не PIC, то хер переделаешь.
Если PIC, то есть реальный шанс, на мой взгляд.

abrek

> Если PIC, то есть реальный шанс, на мой взгляд.
Так это же вообще вроде штатная операция. Однако вопрос перечитай.

bobking

> Однако вопрос перечитай.
Хм, а не Глебу ли ты это сказал?

sergey_m

Кажися в groups.google.com нет постов такой старости. Если тебе действительно очень интересно напиши Valentin Nechaev <segfault.kiev.ua>, скажи что помнишь, что он когда-то давно об этом писал. Мб он подкинет ссылок. Или напиши непосредственно в ru.unix.prog

bobking

> Так это же вообще вроде штатная операция.
Да, ты прав.

ppplva

> > как заставить компилятор написать, какие именно либы он использует ?
> Он использует только те, которые ты указал ему как -llib
Не только, например libc.
А вообще, допустим в путях есть две статические либы с одинаковым названием. Как понять, какая из них была/будет использована при линковке ?

natali20

А вот так
cc file1.c file2.o lib1.a /lib_path/lib2.a -o file
разве нельзя?

sergey_m

В смысле ты задаешь команду
cc $PATH1/libx.a $PATH2/libx.a ля-ля-ля-ля
?
По идее обе подлинкует. Надо проверить.

ppplva

Нет, я имел в виду другое.
Допустим, в путях есть две либы с одинаковым именем. Какой наиболее простой способ выяснить, которая из них будет использоваться ?
Можно, конечно, посмотреть -L, пройтись по путям, найти первую либу с таким именем. Это долго. Может он умеет прямо писать: в качестве -l1 беру, скажем, /usr/lib/lib1.a и так далле ?

sergey_m

Судя по man берет первую.
А что бы писал - хз. Не нашел я в мане ключей связанных с verbosity.

duantusova

gcc --verbose file.c
Да и у линкера такие флаги тоже есть.

ppplva

Он даже про -L не рассказывает

sergey_m

Да, надо было читать не man, а info.
Оставить комментарий
Имя или ник:
Комментарий: