有没有办法对DLL及其.lib文件进行后处理,以删除我不想要的符号?
背景
DLL的代码使用boost :: serialization,这是dllexports(很多)符号。显然这是为了使链接器不要省略未引用的静态对象,但在初始化时会产生重要的副作用。
但是,我非常希望DLL的导出符号中没有提示。
我的理由是,由于链接步骤已经完成,因此可以安全地删除由库引起的符号表中的混乱。
因此,我想知道是否存在一些工具来实现这一目标。
答案 0 :(得分:4)
我不知道这样做的工具,但这里有一段可以构建的C ++代码,可以更改DLL导出的名称。在这种情况下,您可以将不想要的名称设置为空字符串(0字符):
void RemoveUnwantedExports(PSTR ImageName)
{
LOADED_IMAGE image;
// load dll in memory for r/w access
// you'll need Imagehlp.h and Imagehlp.lib to compile successfully
if (MapAndLoad(ImageName, NULL, &image, TRUE, FALSE))
{
// get the export table
ULONG size;
PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)ImageDirectoryEntryToData(image.MappedAddress, FALSE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size);
PIMAGE_SECTION_HEADER *pHeader = new PIMAGE_SECTION_HEADER();
// get the names address
PULONG names = (PULONG)ImageRvaToVa(image.FileHeader, image.MappedAddress, exports->AddressOfNames, pHeader);
for (ULONG i = 0; i < exports->NumberOfNames; i++)
{
// get a given name
PSTR name = (PSTR)ImageRvaToVa(image.FileHeader, image.MappedAddress, names[i] , pHeader);
// printf("%s\n", name); // debug info
if (IsUnwanted(name))
{
name[0] = 0; // set it to an empty string
}
}
UnMapAndLoad(&image); // commit & write
}
}
BOOL IsUnwanted(PSTR name)
{
// implement this
}
它更像某种混淆,但完全删除名称更复杂,因为它需要对导出部分进行完全一致的重写。