使用 std::fstream 会导致程序在 PASE for i (7.3) 中以 SIGILL 结束

Using std::fstream causes program to end with SIGILL in PASE for i (7.3)

我在 IBM 的 CECC 服务的 IBM i 7.3 环境中工作。我正在尝试在 PASE 环境中测试大型应用程序,但我在使用 <fstream> 库的脚本时遇到了问题。以写入模式打开文件会导致脚本以 SIGILL.

终止

为了测试这个问题,我写了下面的脚本:

#include <iostream>
#include <fstream>

int main()
{
        std::ofstream writer;

        std::cout << "Writing file.\n" << std::endl;

        writer.open( "out.txt" );
        if ( !writer.is_open() || !writer.good() )
        {
            std::cerr << "Unable to open file." << std::endl;
            return (1);
        }

        writer << "This is a test.\n" << std::endl;

        writer.close();

        return (0);

}

执行脚本结果:

Writing file.

Illegal instruction (core dumped)

在 GDB 中:

(gdb) run
Starting program: /storage/persist/[app-directory]/test/log/test_write
[New Thread 1]
Writing file.

Program received signal SIGILL, Illegal instruction.
[Switching to Thread 1]
0x08001000a0027940 in _localeinit.bss_3_ () from /QOpenSys/pkgs/bin/../lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/../../../libstdc++.so.6(shr_64.o)
(gdb) bt
#0  0x08001000a0027940 in _localeinit.bss_3_ () from /QOpenSys/pkgs/bin/../lib/gcc/powerpc-ibm-aix6.1.0.0/6.3.0/../../../libstdc++.so.6(shr_64.o)

我 运行 通过在 CentOS7 开发系统上编译和 运行 对代码进行快速健全性检查,它 运行 符合预期 returns没有错误。我还将代码复制到我的主文件夹,它按预期在其中创建和写入 out.txt,但仍然以 SIGILL 失败,而不是返回时没有错误代码。 (应用程序目录中的 运行 也可以正确创建 out.txt,但是当 out.txt 已经使用 -rwx------ 权限创建时失败了。

详情

g++ --version
g++-6.bin (GCC) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.

g++ -dumpmachine
powerpc-ibm-aix6.1.0.0

C++ std 库安装了以下包:

libstdcplusplus-devel.ppc64        6.3.0-29                    @ibm             

代码是使用以下命令编译的:

g++ -std=c++17 -Wall -g3 -O0 -fpie test_write.cpp -o test_write -lpthread

其他不使用<fstream>的程序编译和运行没有错误。由于 i 平台的 PASE 的深奥性质,我很难找到解释此问题潜在原因的文档,但我希望它与编译器设置有关.我想找出原因是什么,以便我可以对我的代码 and/or makefile 进行适当的更改来解决它。

当使用 GCC 为 PASE 编译时,您必须使用 -pthread 而不是 -lpthread(或者也设置 -D_THREAD_SAFE)。否则您可能 运行 遇到问题,因为 PASE 提供的 AIX 头文件具有编译时线程行为。此外,libstdc++ 具有不同的 ABI,具体取决于您在 AIX 平台上是否使用 -pthread 进行编译。在 AIX 上,GCC 将自动适当地设置二进制文件的 运行time 库路径以加载 pthread 或非 pthread GCC 库,而在 PASE 上的开源环境中,我们 only ship pthread 版本。