C 函数的名称更改?

问题描述

我有以下 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++ 代码,而不是 C。在 C++ 中,names are mangled 支持诸如 function overloading 和模板之类的东西。 Mangling 规则取决于编译器,但它通常以 _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这样,因为编译器允许在它们之间放置任意指令