【问题标题】:Removing exported symbols from a DLL and its associated import library (VS8)从 DLL 及其关联的导入库 (VS8) 中删除导出的符号
【发布时间】:2011-09-14 11:28:51
【问题描述】:

有没有办法对 DLL 及其 .lib 文件进行后处理,以删除我不希望在其中包含的符号?

背景:

DLL 的代码使用 boost::serialization,它 dll 导出(很多很多)符号。显然,这是为了使链接器不会忽略未引用但在初始化时具有重要副作用的静态对象。

但是,我非常希望在 DLL 的导出符号中没有任何提升的提示。

我的理由是,由于链接步骤已经完成,删除由库引起的符号表中的混乱是安全的。

因此,我想知道是否有一些工具可以做到这一点。

【问题讨论】:

    标签: visual-studio visual-studio-2005


    【解决方案1】:

    我不知道有什么工具可以做到这一点,但是您可以构建一段 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
    }
    

    这更像是某种混淆,但完全删除名称更复杂,因为它需要完全一致地重写导出部分。

    【讨论】:

    • 太棒了,这是拥有工具的下一个最好的事情。如果多个符号的名称为空,例如与其他也有空名称符号的dll?以及我该如何处理导入库(我想我也必须从那里删除符号,否则它们可能会在链接时发生冲突?)
    • @lijie - 关于他的多个空名称条目,我已经用假 dll 对其进行了测试,它似乎工作正常。关于 .LIB,你应该检查一下。
    • 运行需要包含Windows.h、ImgHlp.h并添加#pragma comment(lib, "imagehlp.lib")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多