簡體   English   中英

如何在MSVC 2005中手動修飾鏈接器名稱?

[英]How to manually decorate linker names in MSVC 2005?

有什么方法可以手動修飾MS C ++中的函數名稱? 我猜想任何解決方案都是特定於Microsoft的,對此我很滿意。

另外,是否可以聲明函數“ ??_M@YGXPAXIHP6EX0@Z@Z ”,以便編譯器可以理解它? 僅供參考, undname將其列出為:

void _ _ stdcall `eh vector destructor iterator'(void * , unsigned int, int, void (_ _thiscall * )(void * ))

顯然,編譯器對我的標識符中的撇號不滿意。

編輯:
該解決方案實際上非常簡單。 我編譯了obj,然后在占位符名稱的正上方十六進制修改了所需的修飾名稱,並在其中填充了空值。 鏈接器將它正確地吃掉了,沒有任何問題。 這些函數是存根,調用外部函數,因此我每次進行小更改時都不必保持十六進制。

感謝大家的想法。

您可以使用帶有以下簽名的MSVC ++生成該符號:

void __stdcall __ehvec_dtor(void * __arr,unsigned int __size,int _ n,void( _stdcall * __dtor)(void *))

顯然__ehvec_dtor映射到異常處理矢量析構函數的特殊整齊符號。

`eh向量析構子迭代器'

您確定撇號是標識符的一部分嗎? 您是否在沒有它們的情況下嘗試使用該功能? 看起來它們的存在是為了提高可讀性。

或者,是否可以聲明函數“ ?? _ M @ YGXPAXIHP6EX0 @ Z @ Z”

我嚴重懷疑,如果我們通過聲明表示同一意思,您是否可以“聲明”名稱錯誤的名稱。 聲明是預編譯,修改發生的時間要晚得多。

_M @ YGXPAXIHP6EX0 @ Z @ Z

這是一個錯誤的名稱。 所有帶有C ++鏈接的符號都被修飾。 這是簽名,返回類型和調用約定信息的哈希。 MSDN上閱讀更多內容。

我假設您知道向量析構函數迭代器是什么,並且只想知道如何在代碼中模仿其名稱。

一種方法可能是在匯編中編寫代碼,這可能(但再次可能不會)使您對函數使用幾乎任何名稱。

另一種方法可能是使用* .def文件的EXPORTS部分(允許您重命名正在使用的內容)中的可選條目名 [= internalname ]語法,將代碼放入DLL並覆蓋DLL的* .def文件中的名稱。導出)。

如果將函數聲明為extern“ C”並使用禁用下划線前綴的鏈接器選項,則在代碼中輸入的名稱即為.obj文件中的名稱。 但這並不能解決您的所有問題,因為當您嘗試在名稱中聲明帶有特殊字符的函數時,編譯器將不知所措。

我想解決方案(IMO的大量工作)是在源代碼(例如PLACEHOLDER_01)中為所需的函數賦予唯一的名稱,然后在.obj文件中替換它們。 您將需要某種方式來解析目標文件並更改符號名稱。

還要注意,“ eh vector destructor iterator”是錯誤的名稱,真實(符號)名稱中不應包含撇號或空格。 轉儲.obj / .dll時,您必須禁用名稱處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM