有什么方法可以删除(或本地化)目标文件中的符号?我正在寻找类似objcopy --keep-global-symbol
linux的东西。
也许有一种方法可以告诉链接器哪些符号应该隐藏?我找到了此页面:https : //msdn.microsoft.com/zh-cn/library/28d6s79h.aspx描述了.Def文件,我从阅读中得到的印象是,我不仅可以将这些文件用于dll,而且可以用于静态文件。库。这是真的?
我需要这样做,因为我链接了两个库A和B,它们输出相同的符号。A是动态链接的,而B是静态链接的。如果A和BI都导出了符号,则我的应用程序希望使用A中的符号,而且我想使用B中的某些符号(仅在B中)。
如果安装Mingw GCC端口之一,例如mingw-w64,则还将获得binutils
Windows PE二进制文件的端口,并且可以使用familar objcopy --keep-global-symbol
。
在bin
您选择的安装目录中找到它,例如C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\bin
然而...
您可能在这里有一个XY问题,因为链接器将从输入序列中第一个定义符号的库中解析出一个符号,而忽略后面库中的定义。因此,仅通过在静态库之前进行链接,您就可以优先选择DLL中的定义。插图:
foo_static.c
#include <stdio.h>
void foo(void)
{
puts("foo_static");
}
bar_static.c
#include <stdio.h>
void bar(void)
{
puts("bar_static");
}
foo_dynamic.c
#include <stdio.h>
__declspec(dllexport) void foo(void)
{
puts("foo_dynamic");
}
gum_dynamic.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
源文件并将目标文件链接到DLL中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
在static.lib
和中定义(不同)dynamic.dll
。bar
仅在中定义static.lib
。gum
仅在dynamic.dll
以下是节目源的呼叫foo
,bar
并且gum
:
main.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.
与static.lib
第一次。程序输出:
>prog.exe
foo_static
bar_static
gum_dynamic
因此foo
从处解决,static.lib
而从处的定义dynamic.dll
被忽略。
现在,让我们以相反的顺序重新链接库,然后prog
再次运行:
>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
这次,foo
从解析,dynamic.dll
而static.lib
忽略的定义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句