2012-12-13 70 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;