计算机系统基础学习 技术日志一(第七章 链接)

计算机系统基础学习 技术日志一(第七章 链接)

本次使用的代码以及链接代码:main2.c addvec.c

main2.c:

include <stdio.h>
#include "vector.h"
int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];
int main() 
{
    addvec(x, y, z, 2);
    printf("z = [%d %d]\n", z[0], z[1]);
    return 0;
}

addvec.c:

int addcnt = 0;
void addvec(int *x, int *y, int *z, int n) 
{
    int i;
    addcnt++;
    for (i = 0; i < n; i++)
	    z[i] = x[i] + y[i];
}

编译生成可重定位文件并查看ELF头

操作:

*1.使用gcc -c main2.c命令编译main2.c 文件,生成main2.o文件
2.使用readelf -h main2.o来查看ELF头

得到ELF头如下:
在这里插阿达入图片描述Magic:表示该文件是ELF目标文件,第一个字节7f是固定的数,后面的45 4c 46这三个字节是E,L,F三个字符的ASCII码形式
类别(Class):表示文件的类型是64位的ELF格式
数据(Data):表示文件中类型的格式组织(大端法或小端法) 这里是小端法
版本(Version):ELF文件头的版本号 这里的版本号为1
OS/ABI: 表示操作系统的类型 这里是UNIX - System V
ABI 版本: 为ABI版本号 这里为0
类型(Type):表示ELF文件类型 这里的是可重定位目标文件REL (共有三种,还有两种为可执行目标文件EXEC和共享目标文件)。
系统架构(Machine): 表示机器的类型 这里为X86-64
版本(Version)(第二个):表示当前目标文件的版本号 这里是1。
入口点地址(Entry point address): 表示程序的虚拟地址入口点 这里为零(因为没有链接,是不可运行的程序)
程序头起点(Start of program headers): 这个程序没有程序头
Start of section headers: sections 头的开始处 这里的1000是十进制,即开始的地址为0x3E8
标志(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头的数量 这里有13个
字符串表索引节头(Section header string table index): section 头字符串表索引号 这里的索引号为10

链接编译生成可重定位文件并查看ELF头

操作:

1.使用gcc main2.c addvec.c -o main2命令编译,生成main2.o文件
2.使用readelf -h main2来查看ELF头

此处出现的错误:开始用的readelf -h main2.o 结果出错
得到ELF头如下:
图片格式无误但是上传失败 下面写出不同处
类型:EXEC可执行文件
入口点地址:0x400430
程序头起点:64
Start of section headers: 6808
标志头的大小(Size of program headers): 56
Number of program headers: 9
节头数量(Number of section headers): 31
字符串表索引节头(Section header string table index): 28
在这里插入图片描述后来发现是网络问题
从这里可以看到,之前因为不可运行显示为0的地方有了数值

3.使用readelf -s main2.o命令
得到ELF头如下:
在这里插入图片描述第一列是序号,第二列为值(因为这是不可运行文件,所以这里的值全为0),第三列为大小,Type指类型,Bind指范围(局部或者全局符号),Visi是版本这里都是默认的,Ndx可以理解为索引/偏移量,Name是名字。

4.使用命令 gcc main2.c addvec.c -fPIC -shared -o main2.so生成main2.so,之后使用命令readelf -s main2.so
得到结果:
在这里插入图片描述因为大小问题,仅展示一部分截图
可以发现,Value是有值的,addvec的ndx也是有值的

5.使用命令readelf -S main2.o
得到结果:
在这里插入图片描述得到的结果与ELF表中的节相符合,下面表示出对应的表:
首地址 名称 大小
00000000 ELF头(指向0x3E8) 无
00000040 .text 41
00000088 .data 10
00000098 .bss 00
000000a5 .comment 36
00000118 .symtab 168
00000280 .strtab 22
000002a8 .rela.text c0
00000380 .shstrtab 61
000003E8 节头表

类似与袁春风老师PPT中的表,但顺序不同

6.使用命令objdump -S main2.o
得到结果:
在这里插入图片描述可以发现main无法找到函数addvec的地址,这是因为没有进行链接,使用命令objdump -d main2进行链接操作
在这里插入图片描述因为大小问题,仅展示一部分结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值