![](/img/trans.png)
[英]relocation R_X86_64_32S against symbol `stdout@@GLIBC_2.2.5' can not be used when making a PIE object
[英]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.