Адрес функции имеет другое значение внутри и снаружи DLL.Значения указателей функций внутри и снаружи DLL
Несколько упрощая, у меня есть следующий код в DLL
typedef struct Holder Holder; /* Struct */
typedef int (*pfn_t)(Holder*); /* Function pointer */
struct Holder { pfn_t pfn; }
int IsSame(Holder *h){ return h->pfn == IsSame; }
В основной программе, у меня есть:
Holder h = { IsSame };
assert(IsSame(&h));
в Assert пожаров! Проблема в том, что h.pfn задан адресом таблицы перехода в main.exe, тогда как код в DLL сравнивает это с адресом функции в DLL.
Есть ли какие-либо магические аннотации или варианты ссылок, которые я могу использовать, чтобы убедить утверждение не стрелять?
Обратите внимание, что это находится в Windows. Posix разделяемого библиотеки модель сильно отличается
[Этот вопрос] (http: // stackoverflow .com/questions/19134124/are-two-function-to-the-same-function-always-equal) могут быть связаны, особенно последний абзац принятого ответа. – Tibo
адрес печати каждой функции. на самом деле это не должно срабатывать – qwr
@Tibo: Если вы имеете в виду «Встроенная функция с внешней связью должна иметь один и тот же адрес во всех единицах перевода». - Да, это то, что я хочу быть правдой ... но это не так. Как отмечено в комментарии, DLL - это Undefined Behavior, а компилятор Microsoft не справляется с ними совершенно. –