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).

questionAnswers(2)

yourAnswerToTheQuestion