[закрыто] MSVC: как определить calling conventions?

yolki

есть либа (.lib), в которой функции без декораций: func1 func2 etc
линкер хочет _func1 _func2 - это __cdecl
если ему сказать __stdcall, то он хочет 8 16
__fastcall: @8 @16 соответственно
язык везде С.

salamander

Calling convention и name mangling - это все-таки разные вещи, и связаны они лишь косвенно.
Q: Как определить calling conventions?
A: Дизассемблировать либу и посмотреть глазами, как параметры в функции передаются.
Только ты, видимо, кое-что другое хотел спросить. Типа "как мне вызвать библиотечные функции с незаманглинными именами из MSVC?" или что-то в этом роде.

procenkotanya

а ты уже убедился, что abi у этой либы (порядок передачи аргументов на стеке/регистрах (каких?), кто подчищает стек, какие регистры сохраняет вызванная функция) совместим с одним из msvc'шных?

Maurog

вопрос нечеткий, так что отвечу аналогично:
1) extern "C"
2) x64
 :grin:
что-нибудь из гугла : http://stackoverflow.com/questions/2804893/c-dll-export-deco...

yolki

да, они такие же.
более того, собрано микрософтовским же тулчейном
extern "C" - это применимо только для c++, здесь же везде С.

yolki

так, тему можно закрывать.
Ларчик открывался так:
либа было собрана при помощи wdk, функции cdecl
я не вижу, как можно преодолеть проблему.
либу пересобрали вижуалстудей, появились префиксы _
в таком виде и будем использовать
либа не моя.
Оставить комментарий
Имя или ник:
Комментарий: