Могу ли я заставить clang генерировать абсолютные адреса для указателей на функции? - PullRequest
2 голосов
/ 12 октября 2011

Вот упрощенная версия кода, с которым я сейчас работаю:

int Do_A_Thing(void)
{
    return(42);
}

void Some_Function(void)
{
    int (*fn_do_thing)(void) = Do_A_Thing;

    fn_do_thing();
}

Когда я компилирую это в xcode 4.1, генерирующий ассемблер устанавливает переменную fn_do_thing следующим образом:

0x2006: calll  0x200b              ;
0x200b: popl   %eax                ; get EIP
0x200c: movl   1333(%eax), %eax

Т.е. он генерирует относительный адрес для места, где можно найти функцию Do_A_Thing - "текущая инструкция плюс 1333", которая в соответствии с файлом карты является "не ленивым указателем" на функцию.* Когда я компилирую аналогичный код в Windows с помощью Visual Studio, Windows генерирует фиксированный адрес вместо того, чтобы делать это относительно этого.Если Do_A_Thing живет, например, в 0x40050914, он просто устанавливает fn_do_thing в 0x40050914.В отличие от этого, xcode устанавливает его на «где я + некоторое смещение».

Есть ли способ заставить xcode генерировать абсолютный адрес для установки указателя на функцию, как это делает Visual Studio?Или есть какая-то причина, которая не сработает?Я заметил, что каждый раз, когда я запускаю программу, функция Do_A_Thing (и все другие функции), похоже, загружаются по другому адресу.

1 Ответ

3 голосов
/ 12 октября 2011

Вы смотрите на код, независимый от позиции (в частности, Независимый от позиции исполняемый файл) в действии.Это, как вы заметили, позволяет ОС загружать двоичный файл в любое место в памяти, что обеспечивает многочисленные улучшения безопасности для потенциально небезопасного кода.

Вы можете отключить его, удалив параметр компоновщика в XCode (-Wl,-pie).

Обратите внимание, что в x86_64 (amd64) инструкции могут работать относительно указателя инструкций, что повышает эффективность этого метода (и делает его в основном "бесплатным" в плане производительности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...