2012-12-13 72 views
3

我目前正在从一些C源文件(我没有,只有对象文件可用)生成ELF格式的对象文件。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 value指定保留索引范围的下限。

  3. SHN_LOPROC到SHN_HIPROC范围用于处理器特定的语义。您应该查看您的平台的ABI以获取有关这些部分索引的信息。

  4. SHN_ABS value指定相应参考的绝对值。这意味着如果符号引用此部分,则其已具有绝对值并且不受重定位的影响。

  5. SHN_COMMON是未分配外部C变量的符号引用。

  6. SHN_HIRESERVE value指定保留索引范围的上限。

请注意,节标题表包含这些节的条目,但从SHN_LOPROC到SHN_HIPROC的包含范围除外。

其他具体说明:

  1. 对于重定位文件,与部分指数SHN_COMMON符号的值指定对齐约束,而不是地址。这可能是指,被声明为全局变量.BSS变量 -

    int arrayofIntegersToDisplay[256];// Declared a COMMON symbol 
    
  2. 对于具有STT_FILE类型符号(持有其代码被编译的文件的名称的字符串值),他们的section-index总是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;