以下是从网上随便找的一段求数组最大值的函数代码
getMax.c
//getMax.c
int getMax(int *ptr, int len){
int *p=ptr;
int max=*p;
for( ; p<(ptr + len); p++){
if(*p >= max){
max = *p;
}
}
return max;
}
main.c
//main.c
int getMax(int *ptr, int len);
int array[4] = {1, 6, 3, 5};
int main()
{
int max = getMax(array, 4);
return max;
}
- 使用gcc -c main.c命令编译main.c生成main.o,再使用readelf -h main.o查看ELF头
每一行的含义:
Magic:说明这是一个ELF目标文件,7f是固定值,45,4c,46分别是E,L,F,的ASCII码
Class:该文件为64位ELF格式
Data:该文件是用小端法组织的
Version:ELF文件头的版本号,这里为1
OS/ABI:操作系统类型为UNIX - System V
ABI Version:ABI版本号为0
Type:该ELF文件类型为REL(Relocatable file),即可重定位目标文件
Machine:机器类型为X86-64
Version:指当前文件的版本号,这里为1
Entry point address:程序的虚拟地址入口点,因为没有链接,不是可运行的程序,所以这里为0
Start of program headers:指程序的程序头,这里为0,指没有程序头
Start of section headers:sections头的开始处,这里的736为十进制,换算为十六进制为0x2E0
Flags:这是一个与处理器相关联的标志,该机器(X86平台)上为 0
Size of this header:该ELF文件头的字节数为64字节
Size of program headers:每个程序头的大小,因为不可运行,所以这里为0
Number of program headers:程序头的数目,因为不可运行,所以这里为0
Size of section headers:section头的大小,这里是64字节。
Number of section headers:section头的数目,这里有12个。
Section header string table index:section 头字符串表索引号,这里是11。
- 使用gcc main.c getMax.c -o main同时编译main.c和getMax.c,再使用readelf -h main命令来查看ELF头,得到的结果如下:
原先包括Entry point address在内的,因程序不可运行而为0的某些参数现在有了值。
使用readelf -s main.o命令,得到结果如下:
Num列是序号
Value列为值(因为这是不可运行文件,所以这里的值全为0)
Size列为大小
Type列指类型
Bind(Binding)指符号的绑定属性(如局部或者全局符号)
Vis列指符号的可见性(Visibility)这里都是默认的
Ndx可以理解为索引(可以理解偏移量)
Name就是名称
从结果可以看出:
数组array,函数main和getMax都是全局符号
Ndx中main的值表示main函数相对于文件main中的位置为1
getMax则因为没有链接而无法找到
倒数第二行是全局偏移表(指向变量的指针数组)。
接下来使用命令 gcc main.c getMax.c -fPIC -shared -o main.so生成main.so,再使用命令readelf -s main.so得到以下结果:
value有了值,getMax的ndx也有了值
- 使用readelf -S main.o得到结果如下
得到的结果与ELF表中的结构相符合,下面表示出对应的表:
首地址 | 名称 | 大小 |
---|---|---|
00000000 | ELF头(指向0x2e0) | 无 |
00000040 | .text | 21 |
00000070 | .data | 10 |
00000080 | .bss | 0 |
00000080 | .comment | 2a |
000000e8 | .symtab | 120 |
00000208 | .strtab | 30 |
00000238 | .rela.text | 30 |
00000280 | .shstrtab | 59 |
000002e0 | 节表头 |
- 使用objdump -S main.o,结果如下:
由于没有链接,main无法找到getMax的地址
再使用objdump -d main,部分结果如下:
链接后,main找到了getMax的地址。
转载:https://blog.csdn.net/qq_39976924/article/details/101911961