代码之家  ›  专栏  ›  技术社区  ›  Igor

从windows上的对象文件中删除符号

  •  1
  • Igor  · 技术社区  · 8 年前

    objcopy --keep-global-symbol 在linux上。

    或者有没有办法告诉链接器哪些符号应该隐藏?我找到了这个页面: https://msdn.microsoft.com/en-us/library/28d6s79h.aspx

    我需要这个,因为我链接了两个库A和B,它们输出相同的符号。A是动态链接的,B是静态链接的。如果a和B都导出了符号,我希望我的应用程序使用a中的符号,另外我还希望使用B中的一些符号(仅在B中)。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mike Kinghan Luchian Grigore    8 年前

    mingw-w64 , 然后你也会得到 binutils 对于Windows PE二进制文件,您将能够使用 objcopy --keep-global-symbol .

    在书里找到它 bin 所选安装的目录,例如。 C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\bin

    然而。。。

    你可能会有一个 XY problem 在这里, 因为链接器将解析输入序列中第一个库中的符号 它定义了它,而忽略了以后的库中的定义;所以你可以 优先考虑DLL中的定义,只需在静态 图书馆。举例说明:

    foo_静态.c

    #include <stdio.h>
    
    void foo(void)
    {
        puts("foo_static");
    }
    

    #include <stdio.h>
    
    void bar(void)
    {
        puts("bar_static");
    }
    

    fooèu动态.c

    #include <stdio.h>
    
    __declspec(dllexport) void foo(void)
    {
        puts("foo_dynamic");
    }
    

    gum\U动态.c

    #include <stdio.h>
    
    __declspec(dllexport) void gum(void)
    {
        puts("gum_dynamic");
    }
    

    *_static.c 将源文件和目标文件归档到静态库中 static.lib :

    >cl -c *_static.c
    Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    bar_static.c
    foo_static.c
    Generating Code...
    
    >lib -out:static.lib *_static.obj
    Microsoft (R) Library Manager Version 14.11.25547.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    

    编译 *_dynamic.c dynamic.dll :

    >cl -c *_dynamic.c
    Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    foo_dynamic.c
    gum_dynamic.c
    Generating Code...
    
    >link -dll -out:dynamic.dll *_dynamic.obj
    Microsoft (R) Incremental Linker Version 14.11.25547.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
       Creating library dynamic.lib and object dynamic.exp
    

    foo 定义(不同)于 静态.lib 和 动态.dll bar 仅在中定义 静态.lib gum 仅在中定义

    这是一个调用 福 酒吧 和 口香糖

    主c

    extern void foo();
    extern void bar();
    extern void gum();
    
    int main()
    {
        foo();
        bar();
        gum();
        return 0;
    }
    

    我们编译了:

    >cl -c main.c
    Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    main.c
    

    prog 这样地:

    >link -out:prog.exe main.obj static.lib dynamic.lib
    Microsoft (R) Incremental Linker Version 14.11.25547.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    

    静态.lib 第一。程序输出:

    >prog.exe
    foo_static
    bar_static
    gum_dynamic
    

    所以呢 已从解决 以及 被忽略了。

    现在让我们重新链接库的顺序,并运行 再一次:

    >link -out:prog.exe main.obj dynamic.lib static.lib
    Microsoft (R) Incremental Linker Version 14.11.25547.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    
    >prog.exe
    foo_dynamic
    bar_static
    gum_dynamic
    

    这次, 福 以及 被忽略了。