macos - 使用 NASM 加载符号的地址?

标签 macos assembly x86-64 nasm

我有一些程序集需要在 OS X (x86-64) 中加载 C 符号。对于 x86,执行此操作的方法是:

mov rax, some_symbol_name

但是,对于 x86-64,这会导致链接警告:

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _main from Test2.o.
To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie

注意:我知道 PIE 是什么,并且我不想禁用它。以下是我将符号地址加载到寄存器中的一些其他尝试:

movq rax, some_symbol_name          ; Link warning
lea rax, [rel some_symbol_name]     ; No link warning, but doesn't always get correct address

我真的被这个(看似)简单的问题难住了。我查看了 GAS 反汇编,它似乎正在按照上面的 lea 进行一些操作,但我无法让 NASM 生成正确的代码。

编辑:作为引用,这是 GAS 生成的汇编代码:

leaq    some_symbol_name(%rip), %rax

最佳答案

您想要强制 NASM 使用 RIP 相对寻址。执行以下操作之一:

lea rax, [rel some_symbol_name]

或者:

default rel
lea rax, [some_symbol_name]

如果这不起作用,请发布 NASM 和 GAS 生成的机器代码。

关于macos - 使用 NASM 加载符号的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8722159/

相关文章:

python - 如何在 OS X 上的 pythonbrew 下构建 pgmagick?

c - VT100 数字键盘使用修饰符(ctrl/shift/alt)时的转义码

c++ - 在比较 2 个短裤的过度对齐结构时,gcc 是否错过了优化机会?

c - 从内联汇编修改 RIP 寄存器

c++ - MacBook 上的 C 和 C++ 编程

node.js - Safari 和 iOS 中的 Express.js 中的 Gzip 压缩问题

assembly - VC++ 2K8 中 SSE 编码的内在函数与内联 ASM

optimization - 帧指针优化的使用

c - 强制编译器为某个变量使用某个寄存器

math - x86-64 大整数表示?