小言_互联网的博客

计算机系统基础 第七章

327人阅读  评论(0)

以下是从网上随便找的一段求数组最大值的函数代码

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场