Статическое связывание Glibc

Как я могу скомпилировать мое приложение, связывающее статически библиотеку glibc, но только код, необходимый для моего приложения? (Не все lib)

Теперь моя команда компиляции:

g++  -o newserver  test.cpp ... -lboost_system -lboost_thread -std=c++0x

Спасибо!

7

Решение

Это то что -static делает (как описано в другом ответе): ненужные модули не будут связаны с вашей программой. Но ваши ожидания от количества вещей, которые необходимый (в том смысле, что мы не можем убедить компоновщика в обратном) может быть слишком оптимистичным.

Если вы пытаетесь сделать это для переносимости (запуск исполняемого файла на других машинах с более старым glibc или чем-то в этом роде), есть один простой тестовый вопрос, чтобы увидеть, получите ли вы то, что хотите:

Вы думали о проблеме с libnss, а ты уверен, что тебя это не укусит?

Если ваш ответ да, может быть, имеет смысл продолжать. Если ответ «нет» или вопрос кажется слишком неясным и ответа нет, просто прекратите свое истечение срока действия с помощью статически связанного glibc: у него больше шансов навредить, чем помочь.

8

Другие решения

добавлять -static к строке компиляции. Он будет только добавлять то, что нужно вашему приложению [и, конечно, любые функции, которые вызываются из приложения, и любые функции, которые эти функции вызывают, включая кучу кода запуска и некоторые другие фрагменты], так что это будет около 800 КБ (для простая программа «hello world») на компьютере с архитектурой x86. Другие архитектуры различаются. Так как boost, вероятно, также немного вызовет стандартную библиотеку, вероятно, к вашему приложению будет добавлено более 800 КБ. Но он применяет только функции, используемые любым кодом в конечном двоичном файле, а не всей библиотекой (около 2 МБ в качестве общей библиотеки).

Если вам нужна ТОЛЬКО ссылка glibc, вам нужно изменить строку компоновки для вашей компиляции, чтобы:
-Wl,-Bstatic -libc -Wl,-Bdynamic, Это предотвратит статическое связывание любой другой библиотеки [иногда вам нужно иметь более одного из этих операторов, так как иногда что-то, извлеченное другой библиотекой, требует извлечения «большего» из glibc — не волнуйтесь, это победило » не может принести ничего, кроме того, что линкер считает необходимым].

1

По вопросам рекламы [email protected]