[問題] 靜態函式庫轉動態函式庫

看板C_and_CPP (C/C++)作者 (蜻蜓)時間15年前 (2010/10/19 16:30), 編輯推噓3(3010)
留言13則, 3人參與, 最新討論串1/2 (看更多)
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 假如我有一組靜態函式庫和宣告 abcd.a abcd.h abcd.h 假設裡面某一個函式宣告為 int FunctionA(int Arg); 主程式是一個動態 DLL 程式 dllMain.h : #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else # define DLLIMPORT __declspec (dllimport) #endif DLLIMPORT int __stdcall FunAPI(int Arg); dllMain.cpp : #include <stdio.h> #include <windows.h> #include "abcd.h" // include 並且使用 FunctionA 函式 #include "dllMain.h" int FunAPI(int Arg) { return FunctionA(Arg); } BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } 加入 abcd.a 編譯完成得到 libdllMain.a libdllMain.def dllMain.dll 之後的程式只要使用 dllMain.dll dllMain.h libdllMain.a 就可以透過 FunAPI 來存取 FunctionA 函式了 現在有一個問題是 有沒有一種編譯方式或其他方法可以將靜態函式庫的 FunctionA 函式 直接 export 出來給其他程式作為動態 DLL 連接用 而不用像上面方法要透過其他函式做銜接 因為我並沒有 abcd.a 的原始碼才無法改寫重新編譯 且我們末端程式一定要用 DLL 連結來使用函式 所以才會有此情況 謝謝各位的幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.68.161.161

10/19 17:15, , 1F
用ollydbg查看含式入口點,直接更改輸出表
10/19 17:15, 1F

10/19 17:22, , 2F
也有不改輸出表的方法,需要考慮到Dll定位的題
10/19 17:22, 2F

10/19 17:23, , 3F
先找到含式的RVA多少
10/19 17:23, 3F

10/19 17:24, , 4F
含式的地址=DLL基址+RVA(偏移量)
10/19 17:24, 4F

10/19 17:27, , 5F
感覺很大的工程
10/19 17:27, 5F

10/19 17:27, , 6F
很簡單XD,用Olly找一下就好了
10/19 17:27, 6F

10/19 17:54, , 7F
可以請樓上講清楚一點嗎?
10/19 17:54, 7F

10/19 17:54, , 8F
static library 要怎麼找 function entry point?
10/19 17:54, 8F

10/19 17:57, , 9F
PE格式都是MZ開頭的,可以用爆力搜尋,建議改輸出表就好
10/19 17:57, 9F

10/19 17:58, , 10F
function entry point 可以用IDA找,或者用debugger
10/19 17:58, 10F

10/19 18:02, , 11F
static library又還沒link,哪來的entry point
10/19 18:02, 11F

10/19 18:02, , 12F
就算有也只是該function在object file中的offset罷了
10/19 18:02, 12F

10/19 18:25, , 13F
沒LINK就不能找到偏移位置嗎?
10/19 18:25, 13F
文章代碼(AID): #1ClLSGhj (C_and_CPP)
文章代碼(AID): #1ClLSGhj (C_and_CPP)