如何在Nasm中创建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,以便苹果的链接可以链接到符号。Microsoft的PE格式和MASM允许它,但是我不确定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

这是汇编文件。

macOS中您可以使用类型N_INDR来别名另一个符号。

来自/system/library/frameworks/kernel.framework/a/headers/mamach-o/nlist.h ::

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

还有一个工具indr,您可以对其进行编译,在使用汇编的情况下可能有助于:

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

最新更新