【问题标题】:Exception handling in gcc compiler in AIXAIX 中 gcc 编译器中的异常处理
【发布时间】:2019-08-25 11:07:59
【问题描述】:

我正在使用 AIX 7.1 和 gcc 8.3 编译器。我看到如果我使用 -Wl,-G 标志构建,抛出的异常不会被捕获。在下面的代码中,如果我不使用 -Wl,-G 标志,我会看到“catch int”。使用此标志,程序核心。

void foo()
{
 try {
   throw 1;
 } catch(int&) {
   std::cout << “catch int” << std::endl;
 }
}

int main()
{
 foo();
}

我的猜测是异常处理默认是禁用的,需要通过一些编译器标志来启用。其他人有这方面的经验吗?请注意,这是特定于 AIX 平台的。

这就是我正在构建的方式。整个代码在 1 个文件中。

bare-08$ g++ -Wl,-G 1.cc

bare-08$ ./a.out

在抛出 'int' 的实例后调用终止 IOT/Abort 陷阱(核心转储)

bare-08$ g++ -Wl,-G -lsupc++ 1.cc

bare-08$ ./a.out

在抛出 'int' 的实例后调用终止 递归调用终止 IOT/Abort 陷阱(核心转储)

如果没有 -G 选项,我会得到如下所示的链接错误(不是在上面的玩具程序中,而是在我的真实代码中)。

ld: 0711-317 错误: 未定义符号: .std::basic_istream >::seekg(long long, std::_Ios_Seekdir) ld:0711-317 错误:未定义符号:.sqrtf ld: 0711-317 错误: 未定义符号: std::basic_streambuf >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode)

有人看过吗?我在一块岩石和一个艰难的地方。使用 -G 选项可以摆脱上述链接错误,但是使用该选项,C++ 异常处理不起作用。

【问题讨论】:

  • 尝试将-lsupc++添加到链接中。
  • 添加 supc++ 是我尝试的第一件事,但没有帮助。我确实在 __cxa_throw 中放置了一个断点,并且通过它似乎我们进入了展开错误,这导致它调用 std::terminate。
  • 请编辑您的原始帖子,并描述您是如何链接共享对象和主可执行文件的。我认为你应该在这两种情况下都使用 -lsupc++。
  • 创建可执行文件时,为什么要使用选项-G?它应该在创建共享对象时使用。

标签: aix


【解决方案1】:

不要使用选项-G。如果您希望使用某些特定于 AIX 的选项,请使用 -brtl

g++ -Wl,-brtl -o AmarnathShanbhag AmarnathShanbhag.cc && ./AmarnathShanbhag
catch int

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多