Статическая ссылка функции разделяемой библиотеки в gcc

Как я могу статически связать функцию общей библиотеки в gcc?

6 ответов

Решение

Ссылаться на:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Вам нужна статическая версия библиотеки для связи.

Общая библиотека на самом деле является исполняемым файлом в специальном формате с указанными точками входа (включая некоторые проблемы с липкой адресацией). Он не имеет всей информации, необходимой для статической ссылки.

Вы не можете статически связывать разделяемую библиотеку (или динамически связывать статическую)

Флаг -static заставит компоновщик использовать статическую библиотеку (.a) вместо общей (.so) Но. Статические библиотеки не всегда устанавливаются по умолчанию. Поэтому, если вам нужна статическая ссылка, вы должны установить статические библиотеки.

Другой возможный подход - использование статификатора или горностая. Оба инструмента принимают в качестве входных данных динамически связанный исполняемый файл и в качестве выходных данных создают автономный исполняемый файл со всеми встроенными общими библиотеками.

Если вы хотите связать, скажем, libapplejuice статически, но не, скажем, liborangejuice, вы можете связать это так:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

Есть предостережение - если liborangejuice использования libapplejuice, затем libapplejuice будет динамически связан тоже.

Вам придется связать liborangejuice статически рядом с libapplejuice получить libapplejuice статичный.

И не забудьте сохранить -Wl,-Bdynamic иначе вы в конечном итоге будете связывать все статическое, включая libc (что не очень хорошая вещь).

Да, я знаю, что это 8-летний вопрос, но мне сказали, что можно статически связываться с библиотекой с разделяемыми объектами, и это было буквально лучшим ударом, когда я искал больше информации об этом.

Фактически продемонстрировать, что статическое связывание библиотеки разделяемых объектов невозможно с ld (gcc компоновщик) - в отличие от просто группы людей, настаивающих на том, что это невозможно - используйте следующее gcc команда:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Конечно, вам придется скомпилировать objectname.o от sourcename.c и, вероятно, вам следует создать собственную библиотеку разделяемых объектов. Если вы делаете, используйте -Wl,--library-path,. чтобы ld мог найти вашу библиотеку в локальном каталоге.)

Фактическая ошибка, которую вы получаете:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

Надеюсь, это поможет.

Если у вас есть файл.a вашей общей библиотеки (.so), вы можете просто включить его в полный путь, как если бы это был объектный файл, например так:

Это генерирует main.o просто компилируя:

gcc -c main.c

Это связывает этот объектный файл с соответствующей статической библиотекой и создает исполняемый файл (с именем "main"):

gcc main.o mylibrary.a -o main

Или в одной команде:

gcc main.c mylibrary.a -o main

Это также может быть абсолютный или относительный путь:

gcc main.c /usr/local/mylibs/mylibrary.a -o main

Немного поздно, но... Я нашел ссылку, которую я сохранил пару лет назад, и подумал, что она может быть полезна вам, ребята:

CDE: автоматически создавать переносимые приложения Linux

http://www.pgbovine.net/cde.html

  • Просто скачайте программу
  • Выполните двоичный файл, передав в качестве аргумента имя двоичного файла, который вы хотите сделать переносимым, например: nmap

    ./cde_2011-08-15_64bit nmap

Программа прочитает все библиотеки, связанные с nmap и его зависимостями, и сохранит их в папке cde-package / (в том же каталоге, что и вы).

  • Наконец, вы можете сжать папку и развернуть переносимый двоичный файл в любой системе.

Помните, что для запуска переносимой программы вы должны выполнить исполняемый файл, расположенный в cde-package/nmap.cde

С наилучшими пожеланиями

В gcc это не поддерживается. Фактически, это не поддерживается ни в одном существующем компиляторе / компоновщике, о котором я знаю.

Другие вопросы по тегам