статическая ссылка gcc - PullRequest
1 голос
/ 28 мая 2011

Я хочу связать статическую библиотеку, которую я включил (например, stdio) с gcc, поэтому я использую опции -static.
Моя среда Ubuntu 10.10.
gcc версия 4.4.5 .
команда компиляции, которую я использовал: gcc -static -o output.out input.c
ниже мой исходный код.
</p> <h1>include <br></h1> <p>int main(){<br> printf("hello world");<br> return 0;<br> }<br> После компиляции и использования опции -static я запускаю исполняемый файл.
и я обнаружил, что printf на самом деле называется _IO_printf.

И я пишу другую программу, следующий код souce.
</p> <h1>include <br></h1> <p>int main(){<br> return 0;<br> }<br> Я компилирую этот исходный код с той же опцией и objdump нового исполняемого файла.
Однако я не могу найти _IO_printf.

У меня вопрос, почему я не могу оштрафовать _IO_printf во втором случае. У меня есть статическая ссылка на библиотеку, которую я включил.

Может кто-нибудь PLZ помочь мне решить эту проблему, спасибо.

1 Ответ

3 голосов
/ 28 мая 2011

Компоновщик не просто соединяет объектные файлы и библиотеки. Это создает связи между различными частями. Поэтому, если в одном блоке есть неразрешенный символ (например, функция или переменная), он ищет его в других единицах и устанавливает соединение.

Поскольку вторая программа не вызывает printf, компоновщику не нужно разрешать этот символ. Поэтому нет смысла добавлять эту функцию в исполняемый файл (она просто будет сидеть и занимать место). Компоновщик может видеть, что отсутствует, и должен (обычно) добавлять только то, что отсутствует, к некоторой практической детализации.

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