Xcode неправильно связывается со старым SDK - PullRequest
2 голосов
/ 08 ноября 2011

У меня проблема с устаревшим 32-битным приложением C, встроенным в Mac OS 10.4, с Xcode 2.2.0.Он работает корректно на более поздних (64-разрядных) системах (10.5 и более поздних), но если я попытаюсь собрать его в более поздних версиях Xcode (2.2.1 - 3.2.6) на 10.5 и более поздних, его поведение изменится, даже если я установлюSDK 10.4 и GCC 4.0 везде (в «настройках проекта» и «настройках активной цели»).

Подробности об измененном поведении: при получении адресов функций через CFBundleGetFunctionPointerForName() и последующем их вызове некоторые возвращают указатели.Затем:

  • Если приложение скомпилировано в Xcode 2.2.0 в Mac OS 10.4 и работает в 10.5+, указатели не могут превышать LONG_MAX, поэтому для сохранения вызова достаточно подписанного longрезультат.

  • Если приложение скомпилировано в Xcode 2.2.1+ в 10.5+ и работает в 10.5+, указатели могут находиться в диапазоне LONG_MAX..ULONG_MAX.

И интерпретация результата как подписанного long очень важна, потому что функции, возвращающие подписанное long (не указатели), вызываются точно так же.Изменение этого параметра приведет к появлению клуджа, поэтому, пожалуйста, не предлагайте разделять вызовы функций, которые возвращают указатели, и функций, которые немедленно возвращают результат - это будет сделано, только если я не смогу получить правильную сборку.

Это различиеповедение сборок, которое я мог бы объяснить только как вызов во время выполнения некоторых других пакетов, чем вызовет более старая сборка - и это возможно, если 1) библиотека CFBundle, которая вызывает функции, не такая, как в реальной версии 10.4 или 2), система правильно определяетSDK более старой сборки и использует правильную «обратную совместимость», но в новых настройках программы что-то не так, и поэтому во время выполнения вызывается другой пакет.

Поэтому мне интересно, есть ли «скрытые» опции?в Xcode или его бэкэндах, что делает разницу между реальной сборкой 10.4 и сборкой 10.4 SDK в более поздних ОС?Или как я могу искать такие различия?

...