【介绍一个工具】如何看一个已经编译好的 elf 文件中,某个指令流的原始信息?

发布时间 2023-11-03 22:46:16作者: ahfuzhang

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


因为 golang 的 plan 9 汇编中不支持部分 avx 指令,因此对于不支持的 avx 指令,只能按照指令格式,以指令流字节的方式把指令插入到汇编代码里,像这样:

	PADDL  X5, X0                    \
	LONG   $0xdacb380f               \ // SHA256RNDS2 XMM3, XMM2
	MOVO   X5, X1                    \
	LONG   $0x0f3a0f66; WORD $0x04cc \ // PALIGNR XMM1, XMM4, 4
	PADDL  X1, X6                    \

指令格式这个感觉还是有点难写,而且某条指令对应的二进制值又去哪里查呢?对于新手还是挺头疼的。

于是我用下面的办法来迂回:

  1. 先用 c + gcc 内置函数来写 avx 指令集的优化代码;
  2. 使用 clang 把 .c 文件编译为 elf 文件;
  3. 找个解析 elf 的工具或者库,找到对应指令的二进制格式。

因此,本文要介绍的就是第三步这个工具:
https://github.com/horsicq/XELFViewer
从这里可以下载 mac 版本: https://github.com/horsicq/XELFViewer/releases/download/0.05/xelfviewer_mac_0.05.pkg

安装后运行,然后在菜单中选择对应的 elf 文件即可:

  1. 在菜单中选择 elf 文件
  2. Disasm 中可以看到反汇编的信息
  3. 找到 gcc 内置函数对应的汇编指令
  4. 对应的位置就是十六进制的指令格式了

寄存器对的上的话,应该就能把这个代码复制到 golang plan9 汇编中使用了。