Как gcc / clang может предположить, что адрес строковой константы 32-битный?

Если я скомпилирую эту программу:

#include <stdio.h>

int main(int argc, char** argv) {
    printf("hello world!\n");
    return 0;
}

для x86-64 вывод asm используетmovl $.LC0, %edi / call puts, (Смотрите полный asm выход / опции компиляции на godbolt.)

Мой вопрос: как GCC может узнать, что адрес строки может помещаться в 32-битный непосредственный операнд? Почему это не нужно использоватьmovabs $.LC0, %rdi (т.е.mov r64, imm64, не ноль или расширенный знакimm32).

AFAIK, ничто не говорит о том, что загрузчик должен решить загрузить раздел данных по какому-либо конкретному адресу. Если строка хранится по какому-либо адресу выше1ULL << 32 тогда старшие биты будут игнорироваться movl. У меня такое же поведение с clang, поэтому я не думаю, что это уникально для GCC.

Мне важно то, что я хочу создать свой собственный сегмент данных, который будет храниться в памяти по любому произвольному адресу, который я выберу (потенциально выше 2 ^ 32)

Ответы на вопрос(2)

Ваш ответ на вопрос