使用 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 版本。
我在 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 版本。