Попытка понять поведение базового компоновщика c - PullRequest
0 голосов
/ 02 марта 2020

У меня есть минимальный cpp файл с содержимым,

int main() {}

Затем я компилирую и связываю, используя

$ g++ -c main.cpp
$ g++ -o main main.o -Wl,-u,foo

Ожидаемое поведение: Поскольку компоновщик не может найти символ foo, потому что он нигде не определен, я ожидал, что компоновщик выдаст ошибку о том, что символ foo не найден / не разрешен.

Фактическое поведение: шаг ссылки выполнен успешно.

Может ли кто-нибудь помочь мне понять это поведение и как я могу заставить компоновщик выдавать ошибку, когда он не может найти неопределенный символ, возможно, используя какой-либо флаг компоновщика?

$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23)

Заранее спасибо !!!

РЕДАКТИРОВАТЬ: Вероятно, это связано с моим недопониманием относительно неопределенных символов, поэтому позвольте мне уточнить мое понимание компоновщика. Компоновщик ищет неопределенные символы в списке последовательно через -llib... и foo, в данном случае это один из таких неопределенных символов. Я ожидал, что в конце обхода всего списка библиотек не должно быть никаких неопределенных символов, т.е. все символы должны быть определены. Я ошибаюсь, думая об этом?

1 Ответ

1 голос
/ 02 марта 2020

Это просто не то, что делает -Wl,u. Из документации ld: «Принудительно вводить символ в выходной файл как неопределенный символ». Таким образом, -u создает таблицу символов в вашем main исполняемом файле и добавляет foo к этому.

Т.е. опция не влияет на то, генерируется ли выходной файл.

Вы можете попробовать g++ -c main.cpp -u foo - передать его компилятору вместо компоновщика, чтобы компилятор мог поместить foo в таблицу символов main.o. Теперь компоновщик увидит foo на своих входах, и ему нужно будет действовать в соответствии с этим.

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