перемещение символа - внешний, статический и класс хранения [дубликат]

Все, что вам нужно сделать, это назначить это свойство:

img {
    display: block;
}

У изображений по умолчанию есть это свойство:

img {
    display: inline;
}
11
задан MetallicPriest 13 March 2012 в 18:50
поделиться

1 ответ

Возможно, ваше замешательство связано со значением extern. Поскольку привязка по умолчанию - extern, любая переменная, объявленная вне области видимости внешней функции без ключевого слова static, является extern.

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

Если переменная известна , которые должны быть определены в одной и той же общей библиотеке (либо потому, что он используется static, либо атрибут видимости hidden или protected, который он использовал), тогда адрес относительно кода в библиотеке может быть исправлен в то время, когда генерируется файл общей библиотеки. В этом случае, вместо того, чтобы выполнять поиск через GOT, компилятор просто генерирует код для доступа к переменной с обращением к программному счету. Это дешевле как во время выполнения, так и во время загрузки (потому что весь процесс поиска и перемещения символа может быть пропущен во время загрузки).

17
ответ дан R.. 19 August 2018 в 06:33
поделиться
  • 1
    Любая идея, как заставить gcc выполнять поиск через GOT для статических переменных? – Violet Giraffe 19 September 2013 в 07:51
  • 2
    Я не могу сразу придумать какой-то способ; зачем вам это нужно? – R.. 19 September 2013 в 08:07
  • 3
    Я пытаюсь сделать свое приложение для процессора ARM как независимым от позиции исполняемым файлом, и все работает отлично, за исключением статических переменных. Проблема состоит в том, что секции .text и .data / .bss имеют разные смещения смещения, поэтому относительный доступ к статическим переменным не зависит, поскольку доступ через GOT работает нормально. – Violet Giraffe 19 September 2013 в 08:20
  • 4
    Как вы ожидаете, что код найдет GOT, если он не имеет фиксированного смещения от секции .text? В обычных системах смещение между текстом и данными фиксируется во время соединения, и загрузчик гарантирует, что он сохраняется при загрузке программы. – R.. 19 September 2013 в 15:08
  • 5
    Это возможно с помощью SBR-относительной адресации, см. stackoverflow.com/a/24408631/779419 – schieferstapel 25 June 2014 в 13:34
Другие вопросы по тегам:

Похожие вопросы: