为什么clang从声明为'extern“ C”'的函数中删除下划线?

问题描述 投票:0回答:1

我正在观看a video,目的是更好地了解目标文件。演示者使用以下示例作为产生非常简单的目标文件的程序的示例:

extern "C" void _start() {
    asm("mov $60, %eax\n"
        "mov $24567837, %edi\n"
        "syscall\n");
}

程序通过编译

clang++ -c step0.cpp -O1 -o step0.o

并通过]链接>

ld -static step0.o -o step0

尝试链接时收到此错误消息:

Undefined symbols for architecture x86_64:
  "start", referenced from:
     -u command line option
     (maybe you meant: __start)
ld: symbol(s) not found for inferred architecture x86_64

我没有传递-u命令行选项,所以我不确定为什么会收到该错误消息。

我正在观看视频,以更好地了解目标文件。演示者使用以下示例作为生成非常简单的目标文件的程序的示例:extern“ C” void _start(){...

linker clang++
1个回答
0
投票

clang不是删除下划线,而是添加了下划线。您的程序实际上正在导出一个__start符号,但是ld希望您的入口点具有一个start符号,即,在您的体系结构中ld默认运行-u start

© www.soinside.com 2019 - 2024. All rights reserved.