gpt4 book ai didi

c - 使用 gcc 将汇编代码与 C 代码链接的正确方法是什么

转载 作者:行者123 更新时间:2023-11-30 16:32:22 25 4
gpt4 key购买 nike

假设您有以下程序集文件:

  .file "print.s"
.intel_syntax noprefix

.text

.globl _start
.type _start, @function
_start:
mov rax, 1
mov rdi, 1
lea rsi, hello_string
mov rdx, 14
syscall
mov rax, 60
mov rdi, 0
syscall
.size _start, .-_start

  .file "string.s"
.intel_syntax noprefix

.data

.globl hello_string
.type hello_string, @object
hello_string:
.string "Hello, world!\n"
.size hello_string, 14

如果您运行as string.s -o string.oas print.s -o print.o,然后ld *.o -o hello.elf,您将获得一个打印 Hello, world! 的可执行文件。现在假设您将 print.s 中的 _start 标签更改为 print 并且您有以下 C 文件:

// main.c
void print(void);

int main (void) {
print();
return 0;
}

我想运行类似 gcc -o main.elf main.c string.s print.s 的东西来获取我的两个汇编文件并将它们链接到标准 C 运行时。这条命令按原样写是行不通的。我收到以下错误消息:

/usr/bin/ld: /tmp/ccc1yRif.o: relocation R_X86_64_32S against symbol `hello_string' can not be used when making a shared object; recompile with -fPIC

我不知道如何正确使用 -fPIcflags来使事情正常工作。我什至不确定这是否是我应该做的。我可以尝试使用内联汇编器来执行此操作,但对于我的实际用例,这将非常烦人,我宁愿学习如何将汇编 block 正确链接到我的 C 程序中。我在网上找不到太多关于此的信息。

Question: How do you correctly use the GNU linker to link assembly files into the C runtime?

编辑:在How to link a C object file with a Assembly Language object file?中,OP 询问如何仅使用 ld 解决类似的链接问题。我想使用 gcc 这是链接问题中推荐的解决方案,但我什至无法让它工作。

最佳答案

好的,我现在已经弄清楚了。错误消息似乎告诉我 gcc 正在尝试创建共享对象。这让我想到了这个问题gcc 6.2.0 is attempting to create shared object when it shouldn't?

解决方案是运行gcc -no-pie main.c string.s print.s -o main.elf

根据手册页,-no-pie 告诉 gcc 不要生成位置独立的可执行文件。

关于c - 使用 gcc 将汇编代码与 C 代码链接的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50186094/

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