typedefstruct { Elf32_Word st_name; /* Symbol name (string tbl index) */ Elf32_Addr st_value; /* Symbol value */ Elf32_Word st_size; /* Symbol size */ unsignedchar st_info; /* Symbol type and binding */ unsignedchar st_other; /* Symbol visibility under glibc>=2.2 */ Elf32_Section st_shndx; /* Section index */ } Elf32_Sym;
st_info这个结构是用于区分各种类型的,也是这一篇博文的重点,这个char结构8位
高 4 位用于表示 st_bind:
值
静态链接行为
STB_LOCAL
允许在不同的目标文件中,存在多个相同名字的符号,符号之间相互隔离(无关联)。
STB_GLOBAL
只允许一个目标文件存在 GLOBAL
符号定义,其它目标文件允许相同名字的未定义的符号引用,即不允许多个定义。
STB_WEAK
允许在不同的目标文件中存在多个相同名字的符号。具体来说,如果同时存在一个
GLOBAL 符号和其它同名 WEAK
符号的定义,那就挑选 GLOBAL 符号(ignores the weak
ones);如果存在多个同名 WEAK 符号的定义,事实标准是挑选
linker 解析过程中接触到的第一个符号。