gpt4 book ai didi

linux - 尽管使用 gcc 链接器,但获取对汇编代码的 "_printf"错误的 undefined reference

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:56 31 4
gpt4 key购买 nike

我正在尝试按照 Paul Carter 的 PC Assembly 一书中的练习进行操作。 http://pacman128.github.io/pcasm/

我正在尝试在 Ubuntu 18 上运行 1.4 第 23 页的程序。这些文件都可以在上面的 github 站点上找到。

由于原始代码是针对 32 位的,所以我使用

进行编译

nasm -f elf32

为first.asm 和asm_io.asm 获取目标文件。我也编译了driver.c

我使用 gcc 的链接器并运行

gcc -m32 -o first first.o asm_io.o driver.o 

但它总是给我一堆错误,比如

对“_scanf”的 undefined reference 对“_printf”的 undefined reference

(注意 _printf 出现而不是 printf 因为在文件 asm_io.asm 中完成了一些转换以保持 windows 和 linux 操作系统之间的兼容性)

我不知道为什么会出现这些错误。我也尝试直接使用链接器运行

ld -m elf_i386 -e main -o first -first.o driver.o asm_io.o -I /lib/i386-linux-gnu/ld-linux.so.2 

和许多变体,因为它似乎没有与 C 库链接。

有什么帮助吗?坚持了一段时间,找不到类似问题的解决方案

最佳答案

当从 C 映射到 ELF 对象文件中的 asm 符号名称时,Linux 不会在名称前加上 _1

所以调用printf,而不是_printf,因为libc中没有_printf

无论“兼容性”代码做了什么,都是错误的。只有 Windows 和 OS X 使用 _printf,Linux 使用 printf

因此,要么您配置错误或定义了错误的设置,要么需要更新/移植到 Linux。


脚注 1:在古代历史中(比如 20 多年前),具有 a.out 文件格式的 Linux 确实在符号名称上使用前导下划线。


更新:该库使用NASM预处理器来%define _scanf scanf等,但它需要您通过汇编手动定义ELF_TYPE nasm -d ELF_TYPE

他们可以自己检测到 ELF32 或 ELF64 输出格式,because NASM pre-defines __OUTPUT_FORMAT__ .有人应该提交一个 pull-request 来使这个检测自动进行,代码如下:

%ifidn __OUTPUT_FORMAT__, elf32
%define ELF_TYPE 32
%elifidn __OUTPUT_FORMAT__, elf64
%define ELF_TYPE 64
%endif


%ifdef ELF_TYPE
...
%endif

关于linux - 尽管使用 gcc 链接器,但获取对汇编代码的 "_printf"错误的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53237752/

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