Ho alcuni assembly che devono caricare un simbolo C in OS X (x86-64). Con x86, il modo in cui lo fai è:
mov rax, some_symbol_name
Tuttavia, con x86-64, questo provoca un avviso di collegamento:
ld: warning: PIE disabilitato. Indirizzamento assoluto (forse -mdynamic-no-pic) non consentito nel codice firmato PIE, ma usato in _main da Test2.o.
Per correggere questo avviso, non compilare -mdynamic-no-pic o link con -Wl, -no_pie
Nota: so cosa è PIE e non voglio disabilitarlo Ecco alcuni dei miei altri tentativi di caricare l'indirizzo del simbolo in un registro:
movq rax, some_symbol_name ; Link warning
lea rax, [rel some_symbol_name] ; No link warning, but doesn"t always get correct address
Sono davvero incappato in questo (apparentemente) semplice problema. Ho visto lo smontaggio del GAS e sembra che stia facendo qualcosa sulla falsariga del lea
sopra, ma non posso ottenere NASM per generare il codice giusto.
EDIT: per riferimento, questo è il codice assembly generato da GAS:
leaq some_symbol_name(%rip), %rax
risposte:
3 per risposta № 1Si desidera forzare il NASM a utilizzare l'indirizzamento relativo RIP. Fai uno di:
lea rax, [rel some_symbol_name]
o:
default rel
lea rax, [some_symbol_name]
Se questo non funziona, inserisci il codice macchina generato da NASM e GAS.