symbols - ELF保留部分

标签 symbols elf object-files

我目前正在处理从一些 C 源文件生成的 ELF 格式的目标文件(我没有,只有目标文件可用)。当我编写一个提取所有 undefined symbol 的小工具时,我遇到了一些具有指向保留部分的部分索引的符号:

详细说明:

ELF 文件中 Symbol Table 中的每个 symbol 条目都有一个带有整数的字段,指向 section header entry index符号属于,到目前为止一切顺利...... ELF 规范定义了一组保留的节头索引,0 代表undefined symbols,以及0xFF00 - 0xFFFF 范围内的其他几个。 关于后一种,ELF规范只有很少的信息,说明这几节

are reserved for processor-specific semantics .

我的问题是:

哪个代码确实导致一个符号有一个节头表索引指向这样一个保留节? 如果它不是来自源代码本身,而是可能来自编译器或其他东西,请解释:)

提前致谢!

最佳答案

以下部分索引是保留的,引用这些部分的符号没有任何部分 -

#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 是一个标记未定义、不相关或无意义的部分引用的值。相对于部分定义的符号是 undefined symbol

  2. SHN_LORESERVE 值指定保留索引范围的下限。

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

  4. SHN_ABS 值指定相应引用的绝对值。这意味着如果一个符号引用了这个部分,那么它已经有一个绝对值并且不受重定位的影响

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

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

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

其他具体说明:

  1. 对于可重定位文件,具有节索引 SHN_COMMON 的符号的值指定对齐约束,而不是地址。这可能适用于声明为全局变量的 .BSS 变量 -

    int arrayofIntegersToDisplay[256];// Declared a COMMON symbol
    
  2. 对于具有 STT_FILE 类型的符号(其中包含编译代码的文件名称的字符串值),它们的节索引始终为 SHN_ABS。这意味着肯定应该声明这种类型的符号。

  3. undefined symbol (节索引 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;

关于symbols - ELF保留部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13858806/

相关文章:

ruby - 为什么 "300".intern 有效但 :300 is not

ubuntu - ELF 文件编译器邮票

c++ - 使用闪存驱动器将已编译的二进制文件复制到另一台机器

c++ - 目标文件中的显式模板代码生成

terminal - 电力线符号不起作用?

debugging - 如何在 OllyDbg 中启用 Microsoft 符号服务器?

package - 如何在不导出所有符号的情况下运行测试

c++ - 这个电话去哪儿了?

c++ - Node-expat 错误的 ELF 类 : ELFCLASS64

static-libraries - 如何在 Linux 上列出静态库的所有外部 undefined symbol ?