Что делает символ ленивым или неленивым?

Недавно я узнал некоторые знания о файле Mach-O. Когда я изучаю ленивый символ и неленивый символ, возникает вопрос: кто определяет ленивый или неленивый символ? и почему?

Я думаю, это может быть компилятор делает это...

ОБНОВЛЕНИЕ: я нашел ответ на свой вопрос, может быть, это правда:

Ленивая привязка управляется опцией -z компоновщика ld. Эта опция принимает ключевые слова в качестве аргумента; ключевые слова включают (среди прочего):

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

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

Ленивая привязка используется по умолчанию. Если вы используете qcc (как мы рекомендуем), используйте параметр -W, чтобы передать параметр -z в ld. Например, укажите -Wl,-zlazy или -Wl,-znow.

Ссылка:Оптимизация компоновщика времени выполнения

Связанный вопрос: Действительно ли Clang/GCC поддерживает функцию отложенной загрузки?


person Ryan Yan    schedule 07.03.2017    source источник


Ответы (1)


Похоже, вы поняли что.

Что касается части почему:

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

person danh    schedule 07.03.2017