Возможно ли построить разделяемую библиотеку со статической связью используемой библиотеки? - PullRequest
13 голосов
/ 28 августа 2009

Я могу собрать исполняемый файл с помощью gcc со статической ссылкой:

gcc -static xxx.c -o xxx

Так что я могу запустить xxx без какой-либо внешней зависимой библиотеки.

Но что, если я хочу создать разделяемую библиотеку без внешней зависимой библиотеки? что я хочу разделяемая библиотека статически связала свою внешнюю ссылку в.

Ответы [ 3 ]

13 голосов
/ 28 августа 2009

Это будет работать:

# Generate position independent code (PIC)
gcc -fPIC -c -o xxx.o xxx.c

# Build a shared object and link with static libraries
ld -shared -static -o xxx.so xxx.o

# Same thing but with static libc
ld -shared -static -o xxx.so xxx.o -lc

Уточнение: флаг -static, если он передан gcc, передается компоновщику (ld) и говорит ему работать со статической версией (.a) библиотеки (указанной с флагом -l), а не динамическая версия (.so).

Другое дело: в моей системе (Debian) последний пример выдает libc.a ... перекомпиляцию с ошибкой -fPIC . Я уверен, что это означает, что libc.a, установленный в моей системе, не был скомпилирован с -fPIC. Однако поиск в apt-cache libc pic дал некоторые результаты.

См. Также: Библиотека программ HOWTO , SO: объединение .so libs , ld (1) , gcc (1)

3 голосов
/ 28 октября 2009

Есть несколько хитрых хакерских атак, которые вы можете сделать с помощью Rpath, так что исполняемый файл ELF или .so сначала будет искать зависимые файлы .so в том же каталоге, что и сам:

  • сделать короткий скрипт echo-rpath, состоящий из

    echo '-Wl, - rpath = $ ORIGIN'

  • добавьте это в вашу командную строку сборки в виде gcc -o file -lwh независимо `echo-rpath ` objects

(Механизм эха не позволяет Make или shell съесть знак $ и обеспечивает его передачу в ld.)

1 голос
/ 28 августа 2009

Если у вас есть планы переносимости вашей общей библиотеки, используйте libtool(1). Он будет обрабатывать большинство деталей флагов компилятора и сделает вашу жизнь намного проще. Если вы не используете libtool, но позже решите, что хотите перенести свою программу на OS X или Windows, в конечном итоге вы все равно будете изобретать ее заново.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...