如何在 NASM 中创建 Mach-O 符号别名?

How to create Mach-O symbol aliases in NASM?

我有一个导出两个函数的汇编文件。函数名称是 NASM_RDRAND_GenerateBlockNASM_RDSEED_GenerateBlock。这些符号缺少前导下划线装饰。该文件由 NASM.

组装而成

在 C/C++ 代码中,符号名称声明为 extern "C" 以避免混淆。 Linux 下的链接和 Cygwin 按预期工作。在 OS X 下链接失败:

...
Undefined symbols for architecture x86_64:
  "_NASM_RDRAND_GenerateBlock", referenced from:
      RDRAND::GenerateBlock(unsigned char*, unsigned long) in libcryptopp.a(rdrand.o)
  "_NASM_RDSEED_GenerateBlock", referenced from:
      RDSEED::GenerateBlock(unsigned char*, unsigned long) in libcryptopp.a(rdrand.o)
ld: symbol(s) not found for architecture x86_64

我想创建一个 _NASM_RDRAND_GenerateBlock = NASM_RDRAND_GenerateBlock 的别名,以便 Apple 的 link 用户可以 link 符号。微软的PE format and MASM allow it,但我不确定Apple和Mach-O是否有类似的设施。

我的第一个问题是,Mach-O 文件格式是否支持符号别名?

如果是这样,那么我的第二个问题是,如何告诉 NASM 创建别名?或者我需要在 NASM 中做什么来创建符号别名?


以下是用于构建目标文件的命令:

nasm -f macho32 rdrand.S -DX86 -g -o rdrand-x86.o
nasm -f macho64 rdrand.S -DX64 -g -o rdrand-x64.o

这里是 assembler file.

macOS 中,您可以使用类型 N_INDR 作为另一个符号的别名。

来自/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach-o/nlist.h:

If the type is N_INDR then the symbol is defined to be the same as another symbol. In this case the n_value field is an index into the string table of the other symbol's name. When the other symbol is defined then they both take on the defined type and value.

还有一个工具indr,您可以编译它,在使用汇编的情况下可能会有所帮助:

https://opensource.apple.com/source/cctools/cctools-895/misc/indr.c