如何限制动态库so符号导出?

软件和网站开发以及相关技术探讨
回复
头像
LinuxLin365
帖子: 11
注册时间: 2023-12-05 11:14

如何限制动态库so符号导出?

#1

帖子 LinuxLin365 » 2024-03-13 15:58

开发了一个动态库,在编译中使用

代码: 全选

-fvisibility=hidden
用来限制符号的导出,对于需要导出的符号使用

代码: 全选

__attribute__ ((visibility ("default")))
,结果是对于自己在动态库中定义的符号使用限制生效了,但是对于自己间接引用的符号依然是GLOBAL权限;

请问如何将动态库内直接定义的符号或间接使用的符号,权限都设置为LOCAL?

root@dso-PC:/home/linux/bin# readelf -s libLck.so |grep _Znam
1405: 00000000000fd760 5 FUNC GLOBAL DEFAULT 12 _ZnamRKSt9nothrow_t
2154: 0000000000083140 5 FUNC GLOBAL DEFAULT 12 _Znam
2329: 00000000000fd760 5 FUNC GLOBAL DEFAULT 12 _ZnamRKSt9nothrow_t
2534: 0000000000083140 5 FUNC GLOBAL DEFAULT 12 _Znam
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: 如何限制动态库so符号导出?

#2

帖子 astolia » 2024-03-14 9:47

LinuxLin365 写了: 2024-03-13 15:58 自己间接引用的符号
啥意思?链接了静态库?-fvisibility只对当前编译的源文件生效

如果静态库是.a包,链接时为gcc加上-Wl,--exclude-libs,ALL就行
如果是.o文件,可以用ar打包后再用上面的参数,或者用version script来控制

.symtab表里的自己用strip去除
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: 如何限制动态库so符号导出?

#3

帖子 astolia » 2024-03-14 10:27

代码: 全选

$ cd /tmp
$ cat a.c 
int add(int a, int b) {
	return a+b;
}
$ gcc -c a.c
$ ar rs -o liba.a a.o
ar: creating liba.a
$ cat b.c
extern int add(int a, int b);
int x() {
	return 2;
}
__attribute__((visibility("default"))) int y() {
	return add(1, x());
}
$ gcc -fvisibility=hidden -Wl,--exclude-libs,ALL -shared -o b.so b.c -L/tmp -la
$ strip b.so
$ readelf -s b.so

Symbol table '.dynsym' contains 6 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_finalize
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMC[...]
     3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterT[...]
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     5: 0000000000001108    32 FUNC    GLOBAL DEFAULT   10 y
头像
LinuxLin365
帖子: 11
注册时间: 2023-12-05 11:14

【已解决】 如何限制动态库so符号导出?

#4

帖子 LinuxLin365 » 2024-03-21 9:04

astolia 写了: 2024-03-14 9:47
LinuxLin365 写了: 2024-03-13 15:58 自己间接引用的符号
啥意思?链接了静态库?-fvisibility只对当前编译的源文件生效

如果静态库是.a包,链接时为gcc加上-Wl,--exclude-libs,ALL就行
如果是.o文件,可以用ar打包后再用上面的参数,或者用version script来控制

.symtab表里的自己用strip去除
:Haha

感谢大佬,是链接的静态库,加上-Wl,--exclude-libs,ALL 解决了
回复