Подскажите плиз какими опциями с++ (g++) можно создать динамическую библиотеку. Если можно приведите пример простейшего makefile для подобной сборки. Заранее спасибо! e-mail: wewe@int.spb.ru
Просто нужно вставить в строке опций компиляции -shared . Это вообщето опция линковщика, а не компилятора, но все же... например, gcc file1.c -shared -o имя_либы Тебе сгенерит либу с именем имя_либы. Ты ее должен будешь переименовать в libимя_либы.so Для того, чтобы она грузилась интерпретатором ELFов, тебе надо будет или сделать ей персональный ldconfig libимя_либы.so или просто скопировать ее в директорию, где лежат либы, нарпимер в /usr/lib
Кстати про херовый совет: много сексу будет на херовом компиллере. Я на 2.96 делал именно прости -shared и все катило на ура, попробовал на 2.95.2 - вот он вам и секс.
НЕ ДОЛЖНО БЫТЬ ТАКОЙ ВОЗМОЖНОСТИ. О-Б-Л-О-М-И-С-Ь. Если тебе кажется, что собранное без -fPIC якобы работает, то подлечись, и всё пройдет. Оно по определению не должно работать. И глюки там могут выплывать в самых неожиданных местах. Если только один бинарник библиотеку использует (только один раз её mmap() сказали) - то глюков может и не быть, а вот с любым следующим будут ба-альшие неприятности. Так что забудь о том, чтобы библиотеки без -fPIC пихать в динамические бинарники.
2Banshee.
> Может кто обьяснит.
Если вкратце, то суть в том, что во все функции, скомпиленные с -fPic, в определенном регистре процессора передается смещение либы в адресном пространстве данной задачи. Точнее, передается независимо от -fPic, но будет ли код в этой функции прибавлять смещение ко всем адресам или не будет - это зависит от опции -fPic. Компилер будет генерить такой код только при наличии этой опции, потому как это означает накладные расходы.
Не знаю, каким образом у вас не работает, но у меня с 2.91.6 все прекрасно работает. Причем .so юзают несколько исполнимых. И ошибок пока не дает. Расскажите, каким образом можно добиться того, чтобы возникла ошибка. И по поводу -fPIC - это чья директива - компилятора или линковщика?
На сколько я понимаю, он генерирует объектники с относительными адресами. То есть с адресами относительно начала секции .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 (это текстовый файл) и все поймешь :)) И ненадо так кричать
Естественно можно включать. Да только вот собраны они всё равно должны быть с -fPIC. А какие конкретно крупные неприятности будут для кода, собранного без -fPIC я сейчас так сразу и не скажу, давно уже не нарывался на подобное, так как давно не использую x86 (а на Альфе PIC не требуется). Вот то, что включение PIC иногда даёт торможение ажно до 25% - долбанный факт. Советую сравнить производительность динамически и статически слинкованного Perl (или Tcl, или еще какого интерпретатора).
Согласен, объектники всеравно болжны быть скомпилированы с опцией -fPIC.
А последствия невключения как я понимаю следующие. Так как в коде все джампы будут по абсолютным адресам, то в случае когда библиотеку будут использовать два разных процесса и естественно будут отображать ее в разные адреса, то в какой-то момент будут совершен переход не туда, и не факт, что это будут начало 2 или 3 или больше байтовой инструкции. Куча матов, типа illegal instruction.
И что мне теперь делать? Есть задача залинковать статически в *.so файл некую либу. Ну например прога должна работать на системе в которой не установлена нужная библиотека и я не хочу утруждать пользователя этим. Мне что в проект переносить исходники той либы? И компилить ее с -fPIC?
А то ведь в /usr/lib лежат только *.so, *.a да *.la