隐藏动态库so中的符号(函数名)

隐藏动态库so中的符号(函数名)

正常的lib库生成

1.c

int func1()
{
    return 1;
}

2.c

extern int func1(void);
int func2()
{
    return func1();
}

编译成动态库 libfunc.so:
gcc -shared -fPIC -o libfunc.so 1.c 2.c
查看符号:

$nm libfunc.so  | grep func
00000000000006c8 T func1
00000000000006d4 T func2

因为我们的 func1 和 func2都没有定义成static,所以都是global类型的函数。

隐藏函数

通过1.c2.c我们可以看到,func1()的函数的存在,实际是为了被func2()调用,但是由于可能是两个模块,所以被分在了2个文件编译。该so作为开源的库,func1()的实现不适合迭代更新,不能让用户使用func1(),我们如何隐藏func1()呢?

方法1

使用 __attribute__((visibility ("hidden")))

__attribute__((visibility ("hidden"))) int func1()
{
    return 1;
}

然后重新编译成动态库
$nm libfunc.so | grep func 0000000000000678 t func1 0000000000000684 T func2
发现符号还在,但是通过readelf发现 是 LOCAL类型的函数

$readelf -s libfunc.so  | grep fun
    39: 0000000000000678    11 FUNC    LOCAL  DEFAULT   11 func1
    48: 0000000000000684    11 FUNC    GLOBAL DEFAULT   11 func2

这意味着, func1 不能被 引用 libfunc.so 的程序调用。

方法2

使用--version-script=

func.map:

{
  local:
  func1;
};

编译动态库:
gcc -shared -fPIC -o libfunc.so 1.c 2.c -Wl,--version-script=./func.map
此时,我们使用readelf查看:
func1 也是 LOCAL类型的,和 func.map设置的一致。

$readelf -s ./libfunc.so | grep func
    39: 0000000000000678    11 FUNC    LOCAL  DEFAULT   11 func1
    48: 0000000000000684    11 FUNC    GLOBAL DEFAULT   11 func2

当然,可以通过通配符来描述 map 文件:

{
  global: func2;
  local: *;
};

通配符的配置必须在最后。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值