我正在尝试获取某个部分的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;
答案 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或任何其他节作为其最终目的地。