LINUX.ORG.RU

Просто нужно вставить в строке опций компиляции -shared . Это вообщето опция линковщика, а не компилятора, но все же... например, gcc file1.c -shared -o имя_либы Тебе сгенерит либу с именем имя_либы. Ты ее должен будешь переименовать в libимя_либы.so Для того, чтобы она грузилась интерпретатором ELFов, тебе надо будет или сделать ей персональный ldconfig libимя_либы.so или просто скопировать ее в директорию, где лежат либы, нарпимер в /usr/lib

Akan
()

Надо использовать libtool. Без неё - затрахаешься. Короче, читай info libtool.

2Akan: ты херовый совет дал. Соберет он без -fPIC, и словит много грязного секса.

anonymous
()

Кстати про херовый совет: много сексу будет на херовом компиллере. Я на 2.96 делал именно прости -shared и все катило на ура, попробовал на 2.95.2 - вот он вам и секс.

stormbringer
()

Может кто обьяснит, а то за"#;%я уже :))

Что за прикол с -fPIC?. Типа генерируется позиционно независимый код.

Что это значит? Я что не смогу слинковать в со-либу обычные объектники. Смогу. И работает. В чем подвох?

Второй вопрос. Как используя libtool сделать со-либу со статически залинкованной в ней другой либой.


типа пример:

$ libtool --mode=link gcc -o libmylib.so /usr/lib/libuuid.a
все нормально.

$ libtool --mode=link gcc -o libmylib.la -rpath /usr/lib -module /usr/lib/libuuid.a
куча матюков. Типа не может слинковать libuuid.a, скомпиляный без -DPIC -fPIC.

должна быть такая возможность. Если нет, мне что отказаться от libtool.

Banshee
()

НЕ ДОЛЖНО БЫТЬ ТАКОЙ ВОЗМОЖНОСТИ. О-Б-Л-О-М-И-С-Ь. Если тебе кажется, что собранное без -fPIC якобы работает, то подлечись, и всё пройдет. Оно по определению не должно работать. И глюки там могут выплывать в самых неожиданных местах. Если только один бинарник библиотеку использует (только один раз её mmap() сказали) - то глюков может и не быть, а вот с любым следующим будут ба-альшие неприятности. Так что забудь о том, чтобы библиотеки без -fPIC пихать в динамические бинарники.

anonymous
()

2Banshee.
> Может кто обьяснит.
Если вкратце, то суть в том, что во все функции, скомпиленные с -fPic, в определенном регистре процессора передается смещение либы в адресном пространстве данной задачи. Точнее, передается независимо от -fPic, но будет ли код в этой функции прибавлять смещение ко всем адресам или не будет - это зависит от опции -fPic. Компилер будет генерить такой код только при наличии этой опции, потому как это означает накладные расходы.

nobody ★★
()

Не знаю, каким образом у вас не работает, но у меня с 2.91.6 все прекрасно работает. Причем .so юзают несколько исполнимых. И ошибок пока не дает. Расскажите, каким образом можно добиться того, чтобы возникла ошибка. И по поводу -fPIC - это чья директива - компилятора или линковщика?

Akan
()

2Akan:

Это опция компилятора.

На сколько я понимаю, он генерирует объектники с относительными адресами. То есть с адресами относительно начала секции .text.

если проиллюстрировать сказанное, то вот вам кусок ld-скрипта

SECTIONS
{

__my_func = .; /* Симбол с абсолютным аддресом */
.text : {
__my_func1 = .; /* Симбол с относительным аддресом */
__my_func2 = ABSOLUTE(.);/* Симбол с абсолютным аддресом */
*(.text)
}

_etext = .;

.data : {
*(.data)
}

_edata = .;

.bss : {
*(.bss)
}
_end = . ;

}

Таким образом, когда происходит линковка и в секцию .text включаются все секции .text из объектников ( *(.text) ),
то флажок -fPIC начинает иметь смысл, так как код внутри секции .text не грузится в фиксированные адреса.

2anonymous:

есть всетаки возможность влючить в so-либу статические библиотеки. Загляни во внутрь /usr/lib/libc.so (это текстовый файл) и все поймешь :)) И ненадо так кричать

Banshee
()

Если не ошибаюсь, то подскажите что происходит на самом деле.

Banshee
()

В смысле если ошибаюсь :))

Banshee
()
Ответ на: комментарий от Banshee

Естественно можно включать. Да только вот собраны они всё равно должны быть с -fPIC. А какие конкретно крупные неприятности будут для кода, собранного без -fPIC я сейчас так сразу и не скажу, давно уже не нарывался на подобное, так как давно не использую x86 (а на Альфе PIC не требуется). Вот то, что включение PIC иногда даёт торможение ажно до 25% - долбанный факт. Советую сравнить производительность динамически и статически слинкованного Perl (или Tcl, или еще какого интерпретатора).

anonymous
()

Согласен, объектники всеравно болжны быть скомпилированы с опцией -fPIC.

А последствия невключения как я понимаю следующие. Так как в коде все джампы будут по абсолютным адресам, то в случае когда библиотеку будут использовать два разных процесса и естественно будут отображать ее в разные адреса, то в какой-то момент будут совершен переход не туда, и не факт, что это будут начало 2 или 3 или больше байтовой инструкции. Куча матов, типа illegal instruction.

И что мне теперь делать? Есть задача залинковать статически в *.so файл некую либу. Ну например прога должна работать на системе в которой не установлена нужная библиотека и я не хочу утруждать пользователя этим. Мне что в проект переносить исходники той либы? И компилить ее с -fPIC?
А то ведь в /usr/lib лежат только *.so, *.a да *.la

Banshee
()
Ответ на: комментарий от Banshee

Да, только так - отдельно компилять полностью PIC-ную библиотеку, и влинковывать её в свою. Других путей нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.