почему есть такая разница?Почему 2 разных подхода?
Вы описали ленивый переселение.
Вам не нужно использовать использовать его, и вы будетене используйте его, если, например, в среде установлено значение LD_BIND_NOW=1
.
Это оптимизация: она позволяет сократить объем работы, которую должен выполнять динамический компоновщик, когда при вызове определенной программы не выполняется многовозможные пути выполнения программы.
Представьте себе программу, которая может вызывать foo()
, bar()
или baz()
, в зависимости от аргументов, и которая вызывает точно одну из подпрограмм в любом заданномвыполнение.
Если вы не используете отложенное перемещение, динамический загрузчик должен будет разрешить все 3 подпрограммы при запуске программы.Ленивое перемещение позволяет динамическому загрузчику выполнять только одно перемещение, которое фактически требуется в любом данном выполнении (функция one , которая вызывается), и точно в нужное время (, когда вызывается функция).
Теперь, почему переменные также не могут быть разрешены таким образом?
Поскольку для динамического загрузчика нет удобного способа узнать когда для выполнения этого перемещения.
Предположим, глобальные значения a
, b
и c
, и что foo()
ссылки a
и b
, bar()
ссылки b
и c
и baz()
ссылки a
и c
.Теоретически динамический загрузчик может сканировать тела foo
, bar
и baz
и создавать карту «если вызывать foo
, а затем разрешать глобальные значения a
и b
» и т. Д. Но этогораздо проще и быстрее просто разрешить все ссылки на глобальные переменные при запуске.