GNU AS ASM 到字节码转储

问题描述 投票:0回答:1

不久前,我创建了这个函数来转储给定 ASM 指令的字节码:

show_bytecode(){ echo "$@" | as -o temp.o && ld --oformat binary -o temp.bin temp.o 2>/dev/null && xxd --ps temp.bin && rm temp.o temp.bin; }

所以我可以这样使用它:

show_bytecode "mov %r8, %r10"
4d89c2

我工作了一段时间,但我不知道为什么(可能是不同的 GNU AS 版本),目前它在字节码之前转储一些垃圾:

$ show_bytecode "mov %r8, %r10" | wc 
    137     137    8335
$ show_bytecode "mov %r8, %r10"
040000002000000005000000474e5500020001c004000000000000000000
0000010001c0040000000100000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
... a lot of zeros ...
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000004d89c2

在查找手册页时,我无法找到如何将字节码限制为仅重要的结果,在这种情况下

4d89c2
就像以前一样。

有人知道这是什么噪音以及如何消除它吗?

使它干净就好了,但是如果您知道其他更好的解决方案来从 ASM 代码打印指令字节码,也可以使用它。

assembly 64-bit gnu-assembler
1个回答
0
投票

除非您特别需要链接,否则只需使用

objcopy
即可:

show_bytecode(){ echo "$@" | as -o temp.o && objcopy -O binary -j .text temp.o temp.bin 2>/dev/null && xxd --ps temp.bin && rm temp.o temp.bin; }

当然,

as
本身可以输出一个列表,这可能足以满足您的目的,特别是如果您只想要一个人类可读的输出:

echo "$@" | as -al -o /dev/null - | tail -n +4
© www.soinside.com 2019 - 2024. All rights reserved.