LINUX.ORG.RU

Собрать объектный файл без декорирования имён

 ,


0

1

Пытаюсь собрать кроссплатформенно объектный файл для линковки с приложением на венде. Проблема в том, что в исходники есть отсылки к winapi, которые подвергаются декорированию из-за соглашения вызовов stdcall. Функции получаются FooBar@123. Мне нужно вот без этого.

Соответственно, gcc сразу в пролёте, при вызове с ключом -c он не вызывает линкер сам.

Вызываю ld -r. Фиг вам. Несмотря на наличие в документации ключей --kill-at и --enable-stdcall-fixup не происходит ровным счётом ничего...

В гугле всё плохо. Кучи аналогичных вопросов и ни одного внятного ответа. Может здесь кто подскажет?

Что ещё. Нет, dll не подходит. Нужен именно объектный файл. Я пробовал линковать к объектнику libkernel32.a из комплекта mingw. Это помогает. Но не до конца. Пропадают зависимости от winapi, но появляется от _lib32_libkernel32_a_iname.

★★★★★

Сделай вывод в ассемблерный листинг через -S и потом обработай код на асме, через регекспы поубирай декодирование

SZT ★★★★★ ()
Последнее исправление: SZT (всего исправлений: 1)

Если вы хотите переименовывать символы в объектном файле, то есть objcopy --rename-sym old=new и objdump. Ну и на счет ld, есть такой параметр -Map который определяет, что линковать и как, с опцией -r. Ну и конечно нужно что-нибудь прочитать, про форматы бинарных файлов: elf, e.t.c.

rk17 ()

хм, а extern «C» уже не в моде?
если в библиотеках нет экспорта классов (в этой части разные компиляторы несовместимы), то функции всегда декорировались через extern «C» для совместимости. в obj файл, по идее, также должны попадать правильно оформленные имена. если нет исходников вендозной части, то надо писать библиотеку-обёртку, в которой экспортируемые функции будут дёргать вендозные вызовы, с декорацией, и компилить её мелкософтовским компилятором.

Iron_Bug ★★★★★ ()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

хм, а extern «C» уже не в моде?

Во первых extern «C» для плюсового когда, а у меня исходники на чистом C. Во вторых он убирает только декорирование плюсов, но не трогает то, что обусловлено соглашениями вызовов. А у меня как раз декорирование от stdcall было. Впрочем, это уже не важно. Я нашёл более правильный способ, при котором ничего портить не надо.

atrus ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.