【问题标题】:Name of C function changes?C函数名称更改?
【发布时间】:2021-06-21 22:22:39
【问题描述】:

我有以下 C 代码:

void test_func()
{
    __asm__ ("mov    $0x2,%rax");
    __asm__ ("mov    $0x6000dd,%rdi");
    __asm__ ("mov    $0x0,%rsi");
    __asm__ ("syscall");
}
int main(int argc, char *argv[]) {
    test_func();
    return 0;
}

当我像这样gcc mine.cxx -S -no-pie 编译它时,我在汇编文件中得到以下内容:

.globl _Z9test_funcv

为什么我的函数名称会改变以及如何防止/预测它的新名称?

【问题讨论】:

标签: c symbols elf name-mangling


【解决方案1】:

您将其编译为 C++ 代码,而不是 C。在 C++ 中 names are mangled 以支持 function overloading 和模板之类的东西。修改规则取决于编译器,但它通常以 _Z 开头,尤其是在 Itanium C++ ABI 之后的编译器中

What is name mangling, and how does it work?

您需要将代码编译为 C。编译器通常根据扩展名确定语言,而在 GCC 中 cxx is one of the C++ extensions 所以只需将文件重命名为 *.c。您还可以强制编译器将代码编译为 C,而不管扩展名如何。执行此操作的选项取决于编译器,例如在 MSVC 中使用 /TC 而在 GCC 中使用 -x c

请注意,您应该这样never put instructions in separate __asm__ statements,因为允许编译器在它们之间放置任意指令

【讨论】:

  • 对不起,你错了,我是这样做的:gcc mine.cxx -S -no-pie
  • @ariel:如果你想写 C,你为什么给你的文件一个 C++ 文件扩展名?
  • cxx 不是 C++ 扩展
  • @ariel 阅读手册gcc.gnu.org/onlinedocs/gcc/… 告诉您扩展cxx 导致GCC 编译为C++。
  • @ariel 如果您将xx 旋转45°,那么它将(大致)变为++。这就是为什么CXX 经常用于表示 C++ 代码的宏中。与 cxx 扩展相同
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多