gpt4 book ai didi

gcc - 为什么 GCC 汇编输出不为 printf 生成 .GLOBAL

转载 作者:行者123 更新时间:2023-12-02 14:30:53 25 4
gpt4 key购买 nike

我有一个简单的 C 程序示例:-

#include <stdio.h>
int main()
{
printf("hello world!");
return 1;
}

我使用以下命令来编译它并生成程序集:-

riscv32-unknown-elf-gcc -S hello.c -o hello.asm

生成以下程序集:-

    .file   "hello.c"
.option nopic
.section .rodata
.align 2
.LC0:
.string "hello world!"
.text
.align 2
.globl main
.type main, @function
main:
addi sp,sp,-16
sw ra,12(sp)
sw s0,8(sp)
addi s0,sp,16
lui a5,%hi(.LC0)
addi a0,a5,%lo(.LC0)
call printf
li a5,1
mv a0,a5
lw ra,12(sp)
lw s0,8(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (GNU) 7.2.0"

有一个预期的 call printf 行,但因为这个程序集文件中没有 printf 的实现,所以我希望看到它请求一个类似这样的外部实现...

.global printf

但是程序集中没有这样的行。我认为如果没有全局指令,这意味着链接器只会尝试将其解析为这个单个程序集文件内的标签。我认为这就是全局指令的全部要点,因此所有标签都是单个程序集文件的本地标签,除非使用 .global 导出以从其他对象文件访问或也使用 .global 从另一个对象文件导入。

我在这里缺少什么?

最佳答案

.global 会将当前文件中的标签标记为具有全局范围(可用于其他模块)。也许您的意思是.extern。虽然 .extern 可以用来表示标签是外部的,但该指令实际上被 GNU 汇编器忽略。来自 manual :

.extern is accepted in the source program--for compatibility with other assemblers--but it is ignored. as treats all undefined symbols as external.

as = GNU 汇编器。

GNU 汇编器假定当前文件中它不知道的任何标签都是外部引用。由链接器来确定它是否未定义。这就是为什么您看不到任何将 printf 标记为外部指令的原因。在 GNU 汇编器中,这是没有必要的。

注意:部分困惑可能在于像 NASM/YASM 这样的汇编器需要显式的 extern 语句来表示符号不在正在汇编的本地模块内。这些汇编器将返回错误,表示符号未定义。这是 GNU 汇编器和 NASM/YASM 之间的区别之一。

<小时/>

.global .directive 不导入标签,因为它本质上是导出。它仅将当前文件中的标签标记为全局可用于其他模块。它不用于从其他模块导入标签。来自手册:

.global makes the symbol visible to ld. If you define symbol in your partial program, its value is made available to other partial programs that are linked with it. Otherwise, symbol takes its attributes from a symbol of the same name from another file linked into the same program.

Both spellings (‘.globl’ and ‘.global’) are accepted, for compatibility with other assemblers.

<小时/>

有一个 .global main 指令将 main 标记为全局。如果没有它,链接器将假定 main 本质上是特定于模块的静态标签,并且不能被其他模块使用。 C 运行时库需要访问 main,因为必须调用 main 作为将控制权转移到 C 入口的最后一步 代码。

关于gcc - 为什么 GCC 汇编输出不为 printf 生成 .GLOBAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47563403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com