Jer*_*ers 9 delphi bpl name-mangling
是否有可能在Delphi中取消这些名称?如果是这样,我在哪里可以获得更多信息?
它无法在dbrtl100.bpl中找到某个条目的错误消息示例我想知道它找不到哪个确切的函数(单位,类,名称,参数等).
---------------------------
myApp.exe - Entry Point Not Found
---------------------------
The procedure entry point @Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl.
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
我知道它是Dbcommon单元中的GetTableNameFromSQLEx方法(我有Delphi和RTL/VCL源代码),但有时我会遇到并非所有代码都可用的应用程序(是的,客户应该总是购买第三方的所有源代码)东西,但有时他们没有).
但是说这是一个我没有代码的例子,或只有接口文件(BDE.INT任何人?)它有什么参数(即哪个潜在的重载)?它有什么回报类型?
对于任何Delphi版本,这种破坏是否相同?
--jeroen
编辑1:
感谢Rob Kennedy:tdump -e dbrtl100.bpl可以解决问题.根本不需要-um:
C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)
Run Code Online (Sandbox Code Playgroud)
编辑2:
感谢TOndrej发现了这篇德语EDN文章(英文谷歌翻译).那篇文章非常准确地描述了格式,应该可以创建一些Delphi代码来解决这个问题.
Pitty,作者提到的网站(和电子邮件)现在已经死了,但很高兴知道这些信息.
--jeroen
Delphi没有提供任何函数名称的功能,我不知道它在任何地方都有记录."坚果壳"中的Delphi提到"tdump"实用程序有一个-um开关,可以使它找到符合标准的符号.我从来没有尝试过.
tdump -um -e dbrtl100.bpl
如果这不起作用,那么解开自己看起来并不是一个非常复杂的方案.显然,名称以"@"开头,后跟单位名称和功能名称,由另一个"@"符号分隔.该函数名后跟"$ qqrx",然后是参数类型.
参数类型使用类型名称的字符计数进行编码,后跟相同的"@" - 分隔格式.
标记函数名称的结尾和参数类型的开头需要"$".剩下的谜团是"qqrx"部分.Tondrej发现的文章揭示了这一点."qqr"表示调用约定,在这种情况下是寄存器,也就是fastcall."x"适用于参数,表示它是常量.
返回类型不需要在受损函数名中编码,因为重载不会考虑返回类型.
如果你有C++ Builder,请查看$(BDS)\ source\cpprtl\Source\misc\unmangle.c - 它包含TDUMP,调试器和链接器使用的unmangling机制的源代码.(C++ Builder和Delphi使用相同的修改方案.)
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |