编译、链接学习笔记(三)静态链接

什么是静态链接

代码经过编译生成目标文件后的下一步是将多个目标文件链接成一个可以执行文件。
将多个目标文件链接成一个可执行文件的过程称为静态链接。

目标文件对于外部符号的处理

单个源文件编译中当引用到外部文件的变量或者函数时(这些外部函数与变量也称为外部符号),会暂时将引用到地址以伪地址代替,等待链接时将真正引用的地址替换上。

以两个文件hello.c和world.c为例子。hello.c引用了两个外部变量,一个为系统标准输出函数printf,一个为全局变量globalInt。

//hello.c
#include <stdio.h>
extern int globalInt ;
int main()
{
  int b = doubleNumber(globalInt);
  return b;
}

//world.c
int globalInt = 4;
int doubleNumber(int a)
{
return a * a;
}

使用-c参数编译
gcc -c hello.c world.c
hello.c 与world.c 并分别输出目标文件,hello.o和world.o

再将hello.o反编译成汇编代码objdump -d hello.o
将world.o反编译成汇编代码objdump -d world.o

hello.o:     文件格式 elf64-x86-64

Disassembly of section .text:

0000000000000000 <main>:
   0:    55                       push   %rbp
   1:    48 89 e5                 mov    %rsp,%rbp
   4:    48 83 ec 10              sub    $0x10,%rsp
   8:    8b 05 00 00 00 00        mov    0x0(%rip),%eax        # e <main+0xe>
   e:    89 c7                    mov    %eax,%edi
  10:    b8 00 00 00 00           mov    $0x0,%eax
  15:    e8 00 00 00 00           callq  1a <main+0x1a>
  1a:    89 45 fc                 mov    %eax,-0x4(%rbp)
  1d:    8b 45 fc                 mov    -0x4(%rbp),%eax
  20:    c9                       leaveq 
  21:    c3                       retq   

这里需要留意两个行命令
1. 8: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # e <main+0xe>
这条指令的作用是将全局变量globalInt传入doubleNumber作为参数。命令为将相对rip位置为0的内存区域,传送至eax中。 其中8b05为mov的命令码,00000000为地址。 <

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值