如何解决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这样,因为编译器允许在它们之间放置任意指令
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。