Как 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)