我有一个非常奇怪的问题。我从一个软件源构建了两个库:static(使用ar)和dynamic(使用gcc)。将测试应用程序与动态库链接后,它可以正常工作。但是与静态库链接的测试应用程序存在“分段错误”或“未处理错误:对齐异常......非法指令”。
为什么呢?我知道我的软件代码中存在一个错误,但如果使用静态库,内存对齐是否存在差异?
答案 0 :(得分:1)
如果你看一下静态与动态链接的定义,应该清楚的是,对于所讨论的两个二进制文件,内存布局是非常不同的。
使用静态链接,满足在链接器符号表中创建的依赖关系所需的所有目标代码都包含在生成的二进制文件中。
通过动态链接,这些依赖项被重写为加载器在加载二进制文件时尝试满足的占位符。根据动态库的对齐要求,将实际的目标代码加载到内存中。
因此,最大的区别在于二进制文件中包含哪些目标代码。包含静态库中的某些内容会导致执行脱轨。我建议你对你的库代码进行一些选择性单元测试以及一些代码检查,以试图找出问题。