gpt4 book ai didi

linux - 将 -dynamic-linker 与链接描述文件一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:34 26 4
gpt4 key购买 nike

我在 Intel 32 位处理器上使用 Linux 2.6.31-14。

C文件:

#include <stdio.h>

main()
{
printf("Hello World!\n");
}

链接器脚本:

SECTIONS{
.text 0x00000100 :{
*(.text)
}
}

输出:

$ gcc -S test.c 
$ as -o test.o test.s
$ ld -T linker.ld -dynamic-linker /lib/ld-linux.so.2 -o test test.o
test.o: In function `main':
test.c:(.text+0x11): undefined reference to `puts'

怎么了?如何让链接描述文件使用动态 C 库?

最佳答案

我认为您应该通过向 ld 参数添加 -lc 选项来将您的程序与 C 标准库 (libc.so) 链接起来。

ld -T linker.ld -lc -dynamic-linker /lib/ld-linux.so.2 -o test test.o

此外,您在运行程序时可能会遇到一些问题(段错误),因为您的 test.o 没有程序入口点(_start 符号)。因此,您将需要带有入口点的额外目标文件,该入口点在 test.o 中调用您的 main() 函数,而不是通过调用 exit() 系统调用来终止代码执行。

这里是start.s代码

# Linux system calls constants
.equ SYSCALL_EXIT, 1
.equ INTERRUPT_LINUX_SYSCALL, 0x80
# Code section
.section .text
.globl _start
_start: # Program entry point
call main # Calling main function
# Now calling exit() system call
movl %eax, %ebx # Saving return value for exit() argument
movl $SYSCALL_EXIT, %eax # System call number
int $INTERRUPT_LINUX_SYSCALL # Raising programm interrupt

然后你应该构建你的程序

gcc test.c -S
as test.s -o test.o
as start.s -o start.o
ld start.o test.o -o test -lc --dynamic-linker=/lib/ld-linux.so.2

您可能还想查看这篇文章 https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free详细了解 C 编译器和标准库的工作原理。

关于linux - 将 -dynamic-linker 与链接描述文件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608957/

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