Всем привет, короче есть следующий код. Код (C): typedef void(*T_TEST)(); void Test() { } typedef struct _FUNCS { T_TEST func; } FUNCS; FUNCS table[] = { {Test}, {Test} }; void Entry() { for (size_t i = 0; i < sizeof(table) / sizeof(FUNCS); ++i) { table[i].func(); } } Проблема в том что в table компилятор вставляет абсолютные адреса к функции Test. Програмка так то работает если запускать, из-за того что грузится по imagebase. А я же подгружаю програмку лоадером и соответственно imagebase отличается от дефолта -> крах. --- Сообщение объединено, 10 апр 2023 --- Разве адреса не должны выщитываться по релокам? Хз, у меня даже эта секция не создается P.S. С веткой че та я на мудрил кнечно, но думаю не важно) --- Сообщение объединено, 10 апр 2023 --- AI предлагает хранить не адреса а оффсеты к функции Test, а при импользвании делать GetModuleHandle(0)+offset. Что вы об этом думаете. Мне как бы код править не особо хочется, т.к код библиотечный
Видимо, в линкере что-то намудрил, что он их отрезает, потому что если по этому адресу при загрузке либы что-то уже будет, она просто не загрузится - винда тоже не сумеет её релоцировать. И никто не сумеет. Поэтому смотри, что у тебя настроено для линкера и в первую очередь верни релоки обратно. А затем в своём лоадере просто пройдись по всем и поправь их, и всё будет работать
Начать надо с того, чем все это собирается, что за компиль и, соответственно линкер, и потом уже что за опции. Конечно такого быть не должно, должны быть релоки. Второй вопрос что за лоадер, если он грузит через LoadLibrary то система может настраивать релоки сама в зависимости от флагов. --- Сообщение объединено, 11 апр 2023 --- Можно для начала попробовать собрать не .exe а .dll и посмотреть как оно будет грузиться.