繁体   English   中英

如何从ELF获取COMDAT符号?

[英]How to get COMDAT Symbol from 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;

我可以回答识别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或任何其他节中作为其最终目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM