Загрузить адрес символа (nasm, 64-битная OS X) - PullRequest
2 голосов
/ 04 января 2012

У меня есть какая-то сборка, которая должна загрузить символ C в OS X (x86-64).С x86 вы можете сделать следующее:

mov rax, some_symbol_name

Однако с x86-64 это вызывает предупреждение о ссылке:

ld: warning: PIE отключен.Абсолютная адресация (возможно, -mdynamic-no-pic) не разрешена в коде, подписанном PIE, но используется в _main из Test2.o.
Чтобы исправить это предупреждение, не компилируйте с -mdynamic-no-pic или не связывайте с -Wl, -no_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 генерировать правильный код.

EDIT: Для справки,это код сборки, сгенерированный GAS:

leaq    some_symbol_name(%rip), %rax

1 Ответ

3 голосов
/ 26 февраля 2012

Вы хотите, чтобы NASM использовал относительную адресацию RIP.Выполните одно из следующих действий:

lea rax, [rel some_symbol_name]

или:

default rel
lea rax, [some_symbol_name]

Если это не работает, опубликуйте машинный код, сгенерированный как NASM, так и GAS.

...