为什么一个C程序编译并链接到一个C编译器,然后在运行时SIGILL
Why would a C program compile and link with a C compiler against C++ libraries then SIGILL at runtime?
我最近在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有很多很好的语句。我们至少需要看到链接行和它的选项来帮助你。通常,带有"忽略未解析符号"的开源链接,因为它们不理解导入文件。因此,该链接将成功地生成一个完全无用的二进制文件——因为这就是要求它这样做的原因。
相关文章:
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 我如何创建一个列表,然后从中创建两个列表,其中一个用于偶数,另一个用于奇数?
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 我的 cout 上有一个奇怪的输出,它把答案放在第一位,然后在我调用它的地方放一个奇怪的输出.我该怎么办?
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 是否可以将前向声明和常规声明合并到一个文件中,然后像分开一样使用它?
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- C++ 如何创建 2D 数组,将其传递给另一个函数,然后打印
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- Gtkmm - 关闭窗口然后显示另一个窗口的正确方法
- 在结构向量中搜索一个数据成员,然后打印匹配的所有数据成员
- 为什么部分初始化一个类然后调用委托 ctor 失败?
- 如何在C++中将类的实例完全重新分配给同一类的另一个实例(然后删除原始对象)?
- 如何读取文件,然后打开一个文件写入文件?
- 将成员函数指针强制转换为另一个类中的一个然后再返回是否安全