看以下例子

main.c

extern int x;

int main()
{
int y = 100;
swap(&x,&y);
return 0;
}
int x = 1;

void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}

段的合并

main.o



swap.o

链接生成静态库: ld main.o swap.o -e main -o stlink 将多个目标链接生成可执行文件,默认好像是静态链接

可以看到生成的stlink的.text .data的大小是原先两个文件之和。2c + 2c = 58

重定位

main.o 反汇编 objdump -d -s main.o



swap.o



通过 objdump -r main.o查看目标文件中有哪些是需要重定位的符号



可以看到main.o中的.text 段有两个符号需要重定位,一个是参数x,一个swap函数,OFFSET分别是17和21。从相应的从main.o 反汇编中可以看到这两个offset处的地址都是 00 00 00 00 是因为在生成main.o的时候还无法确认这些符号的位置(中间b8也是00.. 是为啥?)。

通过readelf -s main.o也可以得到相同的结果(图中的x和swap是UNDEFINED的)



重定位后 objdump -d -s stlink



可以上面需要relocate的位置已经被替换了 参数x 替换成了 600198 这个对应合并后 .data段的绝对地址。

函数swap则是使用的相对寻址 绝对地址是400114,相对地址=下一定要执行的地址和真实swap地址的偏移(400114-40010d=7)

最新文章

  1. 解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  2. ON DUPLICATE KEY UPDATE
  3. 【Oracle】Oracle时间日期格式
  4. WPF Caliburn.Micro ListView 批量删除,有其他方法的大家一起交流一下
  5. JQUERY 一些技巧在实际中的应用
  6. 1.后台如何获取 jquery get方式的ajax的参数
  7. 高性能PHP支持静态类型
  8. 【CF】509E Pretty Song
  9. 执行yiic webapp命令时报错:php.exe不是内部或外部命令,也不是可运行的程序
  10. c++ 输出精度
  11. UML各种图总结-精华
  12. windown 下最简单的安装mysql方式
  13. OS + CentOS 7 / firefox
  14. Navicat for MySQL连接mysql数据库时提示错误:Can't connect to MySQL server (10060)
  15. LeetCode(76): 最小覆盖子串
  16. Linux下MySQL数据库常用基本操作
  17. go标准库的学习-crypto/sha256
  18. crash - JNI WARNING: input is not valid modified utf-8: illegal continuation byte
  19. [Coci2015]Kamp
  20. javascript检测浏览器的缩放状态实现代码 是指浏览器网页内容的百分比缩放(按Ctrl和+号键或者-号键的缩放)

热门文章

  1. Java集合精选常见面试题
  2. JavaWeb3
  3. Enum.Parse的使用
  4. scp工具上传下载
  5. __init__、__all__
  6. SqlServer 联合Update
  7. 1. PyQt5开发环境的搭建
  8. 关于linux mint更改资源管理器的快捷键
  9. SSH(七)新的开始
  10. django中如何开启事务