为什么一个C程序编译并链接到一个C编译器,然后在运行时SIGILL

Why would a C program compile and link with a C compiler against C++ libraries then SIGILL at runtime?

本文关键字:一个 然后 SIGILL 编译器 运行时 编译 程序 为什么 链接      更新时间:2023-10-16

我最近在IBM AIX上编写的一个第三方插件出现了问题。花了很长时间才找到。插件是以C可执行文件的形式出现的。可执行文件是针对第三方库编译的。为强制升级提供了这些库的新版本。

当编译并链接到IBM C编译器12.1时,我现有的代码将产生一个二进制文件,如果使用OLSON设置时区,则使用SIGILL崩溃,如果使用POSIX设置时区,则无法回溯。

我能够通过调试打印到日志文件并刷新日志文件,相当快地追踪到对第三方API的调用。但是第三方提供商花了一些时间才提到,新版本的API在他们自己的代码中引入了c++库的使用。

通过使用IBM C编译器编译但与IBM c++链接器(xlC)链接解决了这个问题。

我的问题是:

1)为什么C链接器不能生成有效的可执行文件?

必须生成一个半有效的二进制文件,否则代码将无法在OLSON时区下工作。这意味着所有的符号都存在,任何名称混淆都得到了处理(尽管可能不正确)

2)如何确定编译器和链接器生成的二进制文件是否有效?

我能想到的唯一方法就是尽可能多地用单元测试来完整地测试代码。

3)我如何防止类似的发生在不同的代码?

我应该总是用c++链接器链接吗?这对我来说似乎不对。

我很抱歉我不能张贴代码,但我没有权利这样做。

Zsigmond有很多很好的语句。我们至少需要看到链接行和它的选项来帮助你。通常,带有"忽略未解析符号"的开源链接,因为它们不理解导入文件。因此,该链接将成功地生成一个完全无用的二进制文件——因为这就是要求它这样做的原因。

相关文章: