C 如果相同的共享库正常工作,为什么静态库会导致对齐问题?

C 如果相同的共享库正常工作,为什么静态库会导致对齐问题?,c,debugging,memory-management,gcc,embedded,C,Debugging,Memory Management,Gcc,Embedded,我有一个很奇怪的问题。我从一个软件源构建了两个库:静态(使用ar)和动态(使用gcc)。在我将测试应用程序与动态库链接后,它工作正常。但与静态库链接的测试应用程序存在“分段错误”或“未处理的错误:对齐异常…非法指令” 为什么??我知道我的软件代码中有一个bug,但是如果使用静态库,内存对齐方式有什么不同吗?如果您查看静态链接和动态链接的定义,应该很清楚,对于所讨论的两个二进制文件,内存布局是非常不同的 使用静态链接,满足链接器符号表中创建的依赖项所需的所有目标代码都包含在生成的二进制文件中 通过

我有一个很奇怪的问题。我从一个软件源构建了两个库:静态(使用ar)和动态(使用gcc)。在我将测试应用程序与动态库链接后,它工作正常。但与静态库链接的测试应用程序存在“分段错误”或“未处理的错误:对齐异常…非法指令”


为什么??我知道我的软件代码中有一个bug,但是如果使用静态库,内存对齐方式有什么不同吗?

如果您查看静态链接和动态链接的定义,应该很清楚,对于所讨论的两个二进制文件,内存布局是非常不同的

使用静态链接,满足链接器符号表中创建的依赖项所需的所有目标代码都包含在生成的二进制文件中

通过动态链接,这些依赖关系被重写为装入二进制文件时装入器试图满足的位置保持器。根据动态库中存在的对齐要求,实际的目标代码加载到内存中的某个位置


因此,最大的区别在于二进制文件中包含了哪些目标代码。静态库中包含的某些内容会使执行脱轨。我建议对您的库代码进行一些选择性的单元测试,同时进行一些代码检查,以找出问题所在。

很难说。它们是您正在使用的两种不同编译的代码。这可能是您的代码中的一个错误,在一种情况下,它不会碰巧表现出来。