Перемещение символа - PullRequest
0 голосов
/ 28 мая 2018

Ниже показано, как будет вызван вызов функции (в первый раз) в PIC

  1. Перейти к записи PLT нашего символа.
  2. Перейти к записи GOT нашего символа.
  3. Перейти к записи PLT и сдвинуть смещение в стеке.То, что смещение на самом деле является структурой Elf_Rel, описывающей, как исправить символ.
  4. Перейти к записи заглушки PLT.
  5. Нажмите указатель на структуру link_map, чтобыкомпоновщик, чтобы найти, к какой библиотеке принадлежит символ.
  6. Подпрограмма распознавания вызовов.
  7. Исправить запись GOT.

Это отличается от того, какделается ссылка на данные, которые просто используют таблицу GOT

Итак, почему есть эта разница?Почему 2 разных подхода?


1 Ответ

0 голосов
/ 29 мая 2018

почему есть такая разница?Почему 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» и т. Д. Но этогораздо проще и быстрее просто разрешить все ссылки на глобальные переменные при запуске.

...