计算机基础——链接

链接

gcc编译器操作指令
1.gcc hello.c
默认的情况下将生成a.out的可执行性文件,你只需要在终端上输入./a.out就可以看到执行的结果.

2.指定生成目标文件的名字那么你可以加上 -o选项,命令如下:
gcc -o hello hello.c

3.只编译源程序,这样可以只检查编译时刻的错误,有利也调试程序,用-c选项可以达到这个目的
gcc -c hello.c
结果生成了一个中间代码hello.o文件

4.优化选项
-O 选项告诉 GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快
-O2 选项告诉 GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用 -O时慢. 但通常产生的代码执行速度会更快

S -s -h命令

代码

int sum(int *a, int n)
{
    int i, s = 0;
    
    for (i = 0; i < n; i++) { 
        s += a[i];
    }
    return s;
}        

sum.c

int sum(int *a, int n);

int array[2] = {1, 2};

int main() 
{
    int val = sum(array, 2);
    return val;
}

main.c

操作

1.gcc -Og -o prog main.c sum.c

使用gcc -Og -o prog main.c sum.c 调用GCC驱动程序构造示例程序,-Og生成可调试文件,-o生成目标文件

2.readelf -h prog
读prog可执行文件的elf头

magic为魔数,7f 45 4c 46为头文件elf的魔数;类别为ELF32,说明格式是32位版本的;数据采用补码表示,按小端方式存放;版本是1;操作系统是UNIX System V;ABI版本是0;文件类型是可执行文件;系统架构为Intel 80386,在32位机器上编译;程序入口地址是0x80482e0;程序头表偏移量为52bytes,长32字节,表项为9,程序头大小为329B;节头表起始位置是6144字节,节头表长是40字节,表项为31,节头表大小为4031B;ELF头大小为52字节;第28项是字符串表。

3.readelf -S prog
读节头表信息

prog为可执行文件,节头表描叙了31个节的信息,起始位置在0x1000;[Nr]为节头表序号,Name为节头表名字,Type表示类型,Addr表示虚拟地址,Off为起始地址,Size表示节长;第0个节是空节;.interp节从0x154开始,长0x13,是可装入的,对齐方式是1字节对齐,末地址为0x154+0x13=0x167,故.note.ABI-tag起始地址为0x168。

4.readelf -S main.o

main.o一共有12个节头,起始位置在0x224,.text类型为PROGBITS,起始地址0x34,节大小0x31,存储可执行代码,在运行时被加载器加载到内存; .rel.text类型为REL,起始地址0x1b4,节大小0x10; .data类型为PROGBITS,起始地址0x68,节大小0x8,可读可访问,存储被初始化的数据;.bss类型NOBITS,起始地址0x70,存储的是未经过初始化的数据,不需要空间,节大小为0,可读可访问,存储未被初始化的静态变量,及初始化为0的全局或静态变量;.comment 类型为PROGBITS,起始地址0x70,节大小0x36,存储未初始化的全局变量;.eh_frame类型为PROGBITS,起始地址0xa8,节大小0x44,运行时被加载到内存;main.o为可重定位文件,节头表信息与可执行文件大同小异,可重定位文件节头表虚拟地址全为0。

5.readelf -s prog
使用-s查看符号在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Name表示符号名,Ndx表示符号所处节表,Bind表示符号类型,Size表示符号所占字节数

readelf -s main.o
在这里插入图片描述

array是main.o中第3节(.data)的符号,是全局变量,占8B;
main是main.o中第1节(.text)的符号,是全局变量,占49B;
sum是未定义的符号,不知道类型和大小,全局的(在其他模块定义)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值