What is __gxx_personality_v0 for?(__gxx_personality_v0 有什么用?)
问题描述
这是一个来自操作系统开发站点的二手问题,但它让我很好奇,因为我在任何地方都找不到合适的解释.
This is a second-hand question from an OS development site, but it made me curious since I couldn't find a decent explanation anywhere.
在使用 gcc 编译和链接一个独立的 C++ 程序时,有时会出现这样的链接器错误:
When compiling and linking a free-standing C++ program using gcc, sometimes a linker error like this occurs:
out/kernel.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
这显然是因为这个符号是在 libstdc++ 中定义的,它在独立环境中是缺失的.解决这个问题只需要在某处定义这个符号:
This is apparently because this symbol is defined in libstdc++, which is missing in a free-standing environment. Fixing the problem simply requires defining this symbol somewhere:
void *__gxx_personality_v0;
这很好,但我不喜欢那些神奇的东西......所以问题是,这个符号的目的是什么?
Which is nice, but I don't like things that just magically work... So the question is, what is the purpose of this symbol?
推荐答案
它用于堆栈展开表,例如您可以在 我对另一个问题的回答.如该答案所述,它的使用由 Itanium C++ ABI 定义,其中它被称为个性程序.
It is used in the stack unwiding tables, which you can see for instance in the assembly output of my answer to another question. As mentioned on that answer, its use is defined by the Itanium C++ ABI, where it is called the Personality Routine.
通过将其定义为全局 NULL void 指针来工作"的原因可能是因为没有任何内容引发异常.当某些东西试图抛出异常时,你会看到它行为不端.
The reason it "works" by defining it as a global NULL void pointer is probably because nothing is throwing an exception. When something tries to throw an exception, then you will see it misbehave.
当然,如果没有使用异常,您可以使用 -fno-exceptions
禁用它们(如果没有使用 RTTI,您也可以添加 -fno-rtti
>).如果您正在使用它们,则必须(正如其他答案已经指出的那样)使用 g++
而不是 gcc
链接,这将添加 -lstdc++
你.
Of course, if nothing is using exceptions, you can disable them with -fno-exceptions
(and if nothing is using RTTI, you can also add -fno-rtti
). If you are using them, you have to (as other answers already noted) link with g++
instead of gcc
, which will add -lstdc++
for you.
这篇关于__gxx_personality_v0 有什么用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:__gxx_personality_v0 有什么用?
基础教程推荐
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01