程序员的自我修养(ELF)

ELF(Executable and Linkable Format,可执行与可链接格式)

文件类型

file SimpleSection.o
1、可重定位文件(relocatable):xxx.o、xxx.a
2、可执行文件(executable)
3、共享目标文件(shared object):xxx.so
4、核心转储文件(core dump)

代码段(.text):指令
数据段(.data):已初始化的全局变量和局部静态变量
BSS(Block Started by Symbol)段(.bss):未初始化的全局变量和局部静态变量
只读数据段(.rodata):只读变量和常量

文件头

readelf -h SimpleSection.o

typedef struct elf32_hdr{
  unsigned char	e_ident[EI_NIDENT];
  Elf32_Half	e_type;
  Elf32_Half	e_machine;
  Elf32_Word	e_version;
  Elf32_Addr	e_entry;  /* Entry point */
  Elf32_Off	e_phoff;
  Elf32_Off	e_shoff;
  Elf32_Word	e_flags;
  Elf32_Half	e_ehsize;
  Elf32_Half	e_phentsize;
  Elf32_Half	e_phnum;
  Elf32_Half	e_shentsize;
  Elf32_Half	e_shnum;
  Elf32_Half	e_shstrndx;
} Elf32_Ehdr;

段表

readelf -S SimpleSection.o

typedef struct elf32_shdr {
  Elf32_Word	sh_name;
  Elf32_Word	sh_type;
  Elf32_Word	sh_flags;
  Elf32_Addr	sh_addr;
  Elf32_Off	sh_offset;
  Elf32_Word	sh_size;
  Elf32_Word	sh_link;
  Elf32_Word	sh_info;
  Elf32_Word	sh_addralign;
  Elf32_Word	sh_entsize;
} Elf32_Shdr;

重定位表

readelf -r SimpleSection.o
.rel.text
.rel.data

typedef struct elf32_rel {
  Elf32_Addr	r_offset;
  Elf32_Word	r_info;
} Elf32_Rel;

字符串表

readelf -x 11 SimpleSection.o
.strtab

段表字符串表

readelf -x 12 SimpleSection.o
.shstrtab

符号表

readelf -s SimpleSection.o
.symtab

typedef struct elf32_sym{
  Elf32_Word	st_name;
  Elf32_Addr	st_value;
  Elf32_Word	st_size;
  unsigned char	st_info;
  unsigned char	st_other;
  Elf32_Half	st_shndx;
} Elf32_Sym;

函数和变量统称为符号

符号类型
1、STT_NOTYPE,未知类型
2、STT_OBJECT,变量
3、STT_FUNC,函数
4、STT_SECTION,段名
5、STT_FILE,文件名

对于非COMMON的STT_OBJECT和STT_FUNC,st_shndx表示符号所在的段在段表中的下标,st_value表示偏移
对于COMMON的STT_OBJECT,st_shndx = SHN_COMMON,st_value表示符号的对齐属性

强符号和弱符号

针对本文件的符号定义
默认函数和已初始化的全局变量为强符号,未初始化的全局变量为弱符号

__attribute__ ((weak))

强引用和弱引用

针对外部文件的符号引用
强引用:如果符号未定义,ld报错;弱引用:如果符号未定义,ld不报错,默认其为0

__attribute__ ((weakref))

程序头表

readelf -l SimpleSection.elf

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值