Como o gcc / clang assume que o endereço de uma constante de string é de 32 bits?
Se eu compilar este programa:
#include <stdio.h>
int main(int argc, char** argv) {
printf("hello world!\n");
return 0;
}
para x86-64, a saída asm usamovl $.LC0, %edi
/ call puts
. (Veja as opções completas de saída / compilação asm no godbolt.)
Minha pergunta é: como o GCC pode saber que o endereço da string pode caber em um operando imediato de 32 bits? Por que não precisa usarmovabs $.LC0, %rdi
(ou seja, ummov r64, imm64
, não um zero ou um sinal estendidoimm32
)
AFAIK, não há nada que diga que o carregador precisa decidir carregar a seção de dados em qualquer endereço específico. Se a string estiver armazenada em algum endereço acima1ULL << 32
os bits mais altos serão ignorados pelo movl. Tenho um comportamento semelhante com o clang, então não acho que isso seja exclusivo do GCC.
O motivo pelo qual me importo é que eu quero criar meu próprio segmento de dados que mora na memória em qualquer endereço arbitrário que eu escolher (acima de 2 ^ 32 potencialmente).