Недавно я узнал некоторые знания о файле Mach-O. Когда я изучаю ленивый символ и неленивый символ, возникает вопрос: кто определяет ленивый или неленивый символ? и почему?
Я думаю, это может быть компилятор делает это...
ОБНОВЛЕНИЕ: я нашел ответ на свой вопрос, может быть, это правда:
Ленивая привязка управляется опцией -z компоновщика ld
. Эта опция принимает ключевые слова в качестве аргумента; ключевые слова включают (среди прочего):
lazy
При создании исполняемой или разделяемой библиотеки отметьте ее, чтобы динамический компоновщик отложил разрешение вызова функции до момента ее вызова (отложенное связывание), а не во время загрузки.
now
При создании исполняемой или разделяемой библиотеки отметьте ее, чтобы динамический компоновщик разрешил все символы при запуске программы или при связывании разделяемой библиотеки с помощью dlopen()
вместо того, чтобы откладывать разрешение вызова функции до момента, когда функция сначала вызывается.
Ленивая привязка используется по умолчанию. Если вы используете qcc
(как мы рекомендуем), используйте параметр -W, чтобы передать параметр -z в ld. Например, укажите -Wl
,-zlazy
или -Wl
,-znow
.
Ссылка:Оптимизация компоновщика времени выполнения
Связанный вопрос: Действительно ли Clang/GCC поддерживает функцию отложенной загрузки?