почему gcc может автоматически помечать символ как слабый - PullRequest
2 голосов
/ 13 марта 2019

Мы создали наш код, используя gcc4.1.2, и мы использовали функцию "lstat64", которая определена в системном заголовочном файле "sys / stat.h", а также в сторонней библиотеке, которую мы используем.

Когда мы «нм» нашего исполняемого файла, мы находим, что:

W  lstat64

Мой вопрос: почему gcc отметил это как слабую функцию?

Кроме того, мы портировали наш код на gcc4.4.4, мы обнаружили, что новый gcc не пометил функцию как «слабую», он пометил ее как неопределенную?

Почему это изменение в поведении?

1 Ответ

2 голосов
/ 13 марта 2019

Согласно документации GCC :

слабый
Слабый атрибут приводит к тому, что объявление генерируется как слабый символ, а не какГлобальный. Это в первую очередь полезно при определении библиотечных функций, которые могут быть переопределены в коде пользователя , хотя его также можно использовать с объявлениями, не относящимися к функциям.Слабые символы поддерживаются для целей ELF, а также для целей a.out при использовании ассемблера и компоновщика GNU.

В вашем случае lstat64, вероятно, был отмечен как слабый в GCC 4.1.2, потому что тогда он не конфликтовал бы со сторонней библиотечной функцией.GCC, вероятно, хотел, чтобы эти внешние функции имели приоритет.

Но в более поздней версии GCC хотел бы, чтобы его собственная версия lstat64 имела приоритет.

...