如何从ELF获得COMDAT符号?

时间:2015-08-11 15:13:01

标签: c elf

我正在尝试获取某个部分的COMDAT符号,我阅读了ELF格式文档,但无法弄清楚如何做到这一点。

我如何识别它是一个COMDAT部分并获得它的符号?

我的代码:

typedef struct
{
   unsigned char    e_ident[EI_NIDENT]; /* Magic number and other info */
   Elf32_Half   e_type;         /* Object file type */
   Elf32_Half   e_machine;      /* Architecture */
   Elf32_Word   e_version;      /* Object file version */
   Elf32_Addr   e_entry;        /* Entry point virtual address */
   Elf32_Off    e_phoff;        /* Program header table file offset */
   Elf32_Off    e_shoff;        /* Section header table file offset */
   Elf32_Word   e_flags;        /* Processor-specific flags */
   Elf32_Half   e_ehsize;       /* ELF header size in bytes */
   Elf32_Half   e_phentsize;        /* Program header table entry size */
   Elf32_Half   e_phnum;        /* Program header table entry count */
   Elf32_Half   e_shentsize;        /* Section header table entry size */
   Elf32_Half   e_shnum;        /* Section header table entry count */
   Elf32_Half   e_shstrndx;     /* Section header string table index */
} Elf32_Ehdr;

typedef struct
{
   Elf32_Word   sh_name;        /* Section name (string tbl index) */
   Elf32_Word   sh_type;        /* Section type */
   Elf32_Word   sh_flags;       /* Section flags */
   Elf32_Addr   sh_addr;        /* Section virtual addr at execution */
   Elf32_Off    sh_offset;      /* Section file offset */
   Elf32_Word   sh_size;        /* Section size in bytes */
   Elf32_Word   sh_link;        /* Link to another section */
   Elf32_Word   sh_info;        /* Additional section information */
   Elf32_Word   sh_addralign;       /* Section alignment */
   Elf32_Word   sh_entsize;     /* Entry size if section holds table */
} Elf32_Shdr;

typedef struct
   {
       Elf32_Word   st_name;        /* Symbol name (string tbl index) */
       Elf32_Addr   st_value;       /* Symbol value */
       Elf32_Word   st_size;        /* Symbol size */
       unsigned char    st_info;        /* Symbol type and binding */
       unsigned char    st_other;       /* Symbol visibility */
       Elf32_Section    st_shndx;       /* Section index */
   } Elf32_Sym;

1 个答案:

答案 0 :(得分:0)

我可以回答第一个识别COMDAT部分的问题。 COMDAT部分可以通过其相关部分名称来标识,即 sh_name

COMDAT部分

COMDAT部分由其部分名称(sh_name)唯一标识。如果链接编辑器遇到SHT_SUNW_COMDAT类型的多个部分,并且具有相同的部分名称,则保留第一部分并丢弃其余部分。应用于丢弃的SHT_SUNW_COMDAT部分的任何重定位都将被忽略。删除在丢弃的部分中定义的任何符号。 http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter7-11598.html将COMDAT定义如下(复制无变更)

此外,链接编辑器支持使用-xF选项调用编译器时用于节重新排序的节命名约定。如果函数放在名为.sectname%funcname的SHT_SUNW_COMDAT部分中,则保留的最终SHT_SUNW_COMDAT部分将合并到名为.sectname的部分中。此方法可用于将SHT_SUNW_COMDAT节放入.text,.data或任何其他节作为其最终目的地。