繁体   English   中英

制作 PIE object 时,不能使用针对未定义符号“ELF”的重定位 R_X86_64_8

[英]relocation R_X86_64_8 against undefined symbol `ELF' can not be used when making a PIE object

在气体中有这个:

    .text
    .globl main
main:
    xor %eax, %eax
    lea str(%rip), %rdi
    call printf
    call exit

str: .byte 0x7F, "ELF", 1,1,1,0

我认为.byte指令可以像 nasm 一样连接

db      0x7F, "ELF", 1, 1, 1, 0         ;   e_ident

来源: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

在 GAS 语法中, "ELF"是对符号名称ELF的符号引用,而不是多字符字符串。 .byte指令的上下文中,它只是在寻找一个数字,而不是一个可能的字符串。

并且由于您将它用作.byte值列表的一个元素,它要求绝对地址的低字节,因此.._8重定位。 含义与 NASM 的db完全不同。

在 GAS 中,当它需要一个数字时, 'E'被允许作为 ASCII 常量,但"E"不是。 例如mov $"E", %eax会给你一个R_X86_64_32 E重定位。

单引号也不起作用。 单字符文字确实可以用作数字,例如mov $'a', %eax等立即数。 但与 NASM 不同,GAS 不支持多字符字符文字。 所以mov eax, 'Hey!' 在 NASM 中工作,但mov $'Hey,', %eax在 GAS 中不起作用。

AFAIK,GAS 仅允许您将多个 ASCII 字符序列用作.ascii / .asciz指令或相关.string / .string16 / .string32窄字符或宽字符指令的文字数据。 气体手册


你有几个选择:

str: .byte 0x7F
     .ascii "ELF"         # separate directives
     .byte 1,1,1,0
str: .byte 0x7F, 'E', 'L', 'F', 1,1,1,0   # separate character literals
str: .asciz "\x7F\ELF\x1\x1\x1"         # hex escapes in a string

\E阻止整个7FE被视为一个十六进制数字。 如果没有额外的反斜杠,它会组装成fe 4c 46 01... (坏)而不是所需的7f 45 4c 46 01... (好)。

IDK,如果有更好/更清洁的方法来做到这一点; 也许是 3 位八进制转义序列?


该教程使用 NASM 的平面二进制 output 模式手动创建 ELF 程序头(用于 32 位可执行文件)。 我猜你正在尝试创建一个 64 位程序来打印 output,出于某种原因? 它碰巧不包含任何0%字节,所以是的,您可以使用 output 它与printf

将教程移植到 GAS 语法的更直接的方法是使用ld as output 链接到平面二进制文件中。 如何使用 GNU GAS 汇编器生成像 nasm -f bin 这样的普通二进制文件?

或者使用objcopy.o或可执行文件的.text部分复制到平面二进制文件中。 如果您使用objcopy ,请确保所有内容都在.text部分中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM