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

时间:2017-03-13 06:34:09

标签: macos nasm symbols mach-o

我有一个导出两个函数的汇编文件。函数名称为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的链接器可以链接到该符号。微软的here,但我不确定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

这是PE format and MASM allow it

1 个答案:

答案 0 :(得分:1)

macOS中,您可以使用N_INDR类别为另一个符号添加别名。

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

  

如果类型是N_INDR,则符号定义为相同   作为另一个象征。在这种情况下,n_value字段是索引   另一个符号名称的字符串表。当另一个符号   然后定义它们都采用定义的类型和值。

还有一个工具indr,您可以编译它,这可能对使用汇编有帮助:

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