linux中间文件与可执行文件的区别

先编写一个hello.c源程序

#include <stdio.h>
int main(){
	printf("hello world\n");
	return 0;
}
gcc -c hello.c
gcc -o hello hello.o

elf文件有两种视图,一种是链接视图,另一种是执行视图。hello.o是中间产物,还没有完成链接,不能执行。而hello是可以执行的,由于使用了函数库printf,所以hello是经过链接的。
计算机靠header中的type来区分到底是哪种。

readelf -h hello

可以看到其type为DYN,动态共享文件。
hello的header

readelf -h hello.o

这时可以看到,hello.o是可重定位文件。
hello.o的header在头信息中可以看到,可执行文件的程序入口也是给定的,这是靠诉操作系统加载到指定的位置,而链接文件,地址是0。
符号表的结构体,源代码的位置在/usr/include/elf.h中。

typedef struct
{
  Elf64_Word	st_name;		/* Symbol name (string tbl index) */
  unsigned char	st_info;		/* Symbol type and binding */
  unsigned char st_other;		/* Symbol visibility */
  Elf64_Section	st_shndx;		/* Section index */
  Elf64_Addr	st_value;		/* Symbol value */
  Elf64_Xword	st_size;		/* Symbol size */
} Elf64_Sym;

符号表中包括section的信息,因为多个elf文件在链接时,还会进行section的合并.

readelf -s hello.o

main函数的位置是0
hello.o的符号表

hello的动态符号表
hello的静态符号表(1)hello的静态符号表(2)动态符号表与静态符号表用的都是同一个结构体。其区别是,在链接完成后,静态符号表的值已经确定,比如上面的函数main,如图所示,其地址是ox63a,而动太符号表会在合适的时机才确定,所以其地址暂为0。而在链接之前,符号表中的值均为0。这样完成了静态链接部分。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值