链接共享库时限制符号的可见性 [英] Limiting visibility of symbols when linking shared libraries

查看:118
本文介绍了链接共享库时限制符号的可见性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

某些平台要求您向链接程序提供共享库的外部符号的列表.但是,在大多数unixish系统上,这不是必需的:默认情况下,所有非静态符号都将可用.

Some platforms mandate that you provide a list of a shared library's external symbols to the linker. However, on most unixish systems that's not necessary: all non-static symbols will be available by default.

我的理解是,GNU工具链可以选择将可见性限制为仅显式声明的符号.使用GNU ld如何实现?

My understanding is that the GNU toolchain can optionally restrict visibility just to symbols explicitly declared. How can that be achieved using GNU ld?

推荐答案

GNU ld可以在ELF平台上做到这一点.

GNU ld can do that on ELF platforms.

以下是使用链接器版本脚本进行操作的方法:

Here is how to do it with a linker version script:

/* foo.c */
int foo() { return 42; }
int bar() { return foo() + 1; }
int baz() { return bar() - 1; }

gcc -fPIC -shared -o libfoo.so foo.c && nm -D libfoo.so | grep ' T '

默认情况下,所有符号都会导出:

By default, all symbols are exported:

0000000000000718 T _fini
00000000000005b8 T _init
00000000000006b7 T bar
00000000000006c9 T baz
00000000000006ac T foo

假设您只想导出bar()baz().创建一个版本脚本" libfoo.version:

Let's say you want to export only bar() and baz(). Create a "version script" libfoo.version:

FOO {
  global: bar; baz; # explicitly list symbols to be exported
  local: *;         # hide everything else
};

将其传递给链接器:

gcc -fPIC -shared -o libfoo.so foo.c -Wl,--version-script=libfoo.version

观察导出的符号:

nm -D libfoo.so | grep ' T '
00000000000005f7 T bar
0000000000000609 T baz

这篇关于链接共享库时限制符号的可见性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆