Вот упрощенная версия кода, с которым я сейчас работаю:
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 (и все другие функции), похоже, загружаются по другому адресу.