2012-12-13 3 views
3

В настоящее время я работаю над объектными файлами в формате ELF, сгенерированными из некоторых исходных файлов C (у меня их нет, доступны только объектные файлы). Как я написал небольшой инструмент, который извлекает все неопределенные символы, я наткнулся на некоторые символы, которые имеют раздел индексы, указывающие на заповедных участках:ELF зарезервированный раздел

Подробно:

Каждый symbol запись в Symbol Table в файле ELF имеет поле с целым числом, указывающее на section header entry index, к которому принадлежит этот символ, настолько хорошо ... Спецификация ELF определяет группу индексов заголовка зарезервированного раздела, значение 0 для undefined symbols и несколько других в диапазоне 0xFF00 - 0xFFFF. О последнем одном, то ELF спецификация имеет только очень мало информации, о том, что эти разделы

зарезервированы для конкретного процессора семантики .

Мой вопрос:

Какой код действительно приводит к символу с индексом таблицы заголовка раздела, указывающий на такой reserved section? Если он исходит не из исходного кода, а, может быть, из компилятора или чего-то еще, пожалуйста, объясните :)

Заранее спасибо!

+0

Не зная, о каком процессоре вы говорите, и о каком конкретном процессоре разделе трудно сказать. – ajax

+0

Спасибо за ответ (наконец, D)! Можно ли дать общий ответ на мой вопрос? Итак, если есть какие-либо кодовые конструкции, которые всегда приводят к таким символам? –

ответ

0

следующие показатели этой секции защищены и символы, относящиеся к этим разделам не имеют какой-либо секции -

#define SHN_UNDEF  0x00 
#define SHN_LORESERVE 0xFF00 
#define SHN_LOPROC  0xFF00 
#define SHN_HIPROC  0xFF1F 
#define SHN_ABS   0xFFF1 
#define SHN_COMMON  0xFFF2 
#define SHN_HIRESERVE 0xFFFF 

Согласно ELF формат спецификации,

  1. SHN_UNDEF является значение, которое обозначает неопределенную, нерелевантную или иначе бессмысленную ссылку на раздел. Символом, определенным относительно секции, является неопределенный символ.

  2. SHN_LORESERVE Значение определяет нижнюю границу диапазона зарезервированных индексов.

  3. SHN_LOPROC до SHN_HIPROC диапазон предназначен для специфической для процессора семантики. Вы должны заглянуть в ABI для своей платформы, чтобы получить информацию об этих индексах раздела.

  4. SHN_ABS Значение определяет абсолютные значения для соответствующей ссылки. Это означает, что , если символ ссылается на этот раздел, то он уже имеет абсолютное значение и не зависит от перемещения.

  5. SHN_COMMON является ссылкой символами, которые являются нераспределенными внешними переменными С.

  6. Значение SHN_HIRESERVE указывает, что верхняя граница диапазона зарезервированных индексов.

Обратите внимание, что заголовок таблицы раздел содержит записи для этих секций, для инклюзивного диапазоне от SHN_LOPROC до SHN_HIPROC кроме.

Других конкретные замечания:

  1. Для перемещаемых файлов, значение символа с раздела индексным SHN_COMMON задает ограничение выравнивания, а не адрес. Это, вероятно, для .bss переменных, которые объявлены как глобальные переменные -

    int arrayofIntegersToDisplay[256];// Declared a COMMON symbol 
    
  2. Для символов с типом STT_FILE (которые удерживают строковое значение имени файла, в котором код был скомпилирован), их индекс раздела всегда SHN_ABS. Это означает, что символ этого типа обязательно должен быть объявлен.

  3. Неопределенные символы (раздел индекс SHN_UNDEF, как указано выше) используются, когда данные ссылки на файл объект выделен в другом файле -

Примером может быть что-то подобное,

/// @file Main.cpp 
/// 
/// Here, we are declaring the variable "var". It is a STT_DATA 
/// symbol which (should) have the section-index for ".data" 
int var; 

В другом файле

/// @file Referer.cpp 
/// 
/// Here, we are referencing the variable "var" allocated in the 
/// object file for Main.cpp. It is an undefined symbol. 
extern int var; 

 Смежные вопросы

  • Нет связанных вопросов^_^