objdump命令分析
选项
显示.o文件中的text段的内容:
显示目标文件各个段的头部摘要信息:
objdump -s -d:显示文件所有段信息:
【数据段为标红方框】
可执行文件如何链接:
符号表里面的mysum被标记为UND(undefined),也就是在t1.o中没有定义,所以将来要通过ld(Linux下的链接器)的符号解析功能到别的模块中去查找是否存在函数mysum的定义。
对函数mysum的调用是通过call指令实现的,使用IP相对寻址方式,由于无法确定具体的地址,此时编译器只是将其赋了一个特殊的地址0x0,然后在最后的链接阶段再完成正确的地址赋值。在t2.c中找到该函数,重定位之后call指令中的这个偏移量被修改,最终的可执行程序就生成了。
链接部分大概的过程就是:
1、链接器接收到输入文件
2、收集每个输入文件的段表,合成一个全局符号表,这张表里包含所有定义的符号
3、如果是静态链接,将多个输入文件合并,进行地址空间的分配,在这一步完成之后所有符号的具体地址就定了
4、然后再对每一个输入文件中需要重定位的符号重新定位到正确的地址处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通