1. 程式人生 > >動態庫的符號隱藏

動態庫的符號隱藏

overview

•       gcc -fPIC -c a.c

•       gcc -fPIC -c b.c

•       gcc -fPIC -c c.c

•       gcc -fPIC -c d.c

•       gcc -shared -o libfoo2.so a.o b.o  -Wl,--version-script=libfoo.map

•       gcc -shared -o libfoob.so c.o d.o  -Wl,--version-script=libfoob.map

•       gcc -o hello_hide main.c -L. -lfoo2 –lfoob

•       export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH

•       ./hello_hide

Source code

•       a.c void foo(){bar();}

•       b.c void bar(){printf("ok\n");}

•       c.c void bar2(){printf("ok222\n");}

•       d.c void foo2(){bar2();}

  map file

•       Libfoob.map {global: foo2;local: *;};

•       Libfoo.map    {global: foo;local: *;};

Old build & nm compare

•       gcc -shared -o libfoo.so a.o b.o 

•       gcc -shared -o libfoob.so c.o d.o

•       gcc -o hello main.c -L. -lfoo -lfoob

•       nm -D libfoo.so|grep -v '_‘

•       nm -D libfoob.so|grep -v '_‘

•       nm -D libfoo2.so|grep -v '_‘

•       nm -D libfoob.so|grep -v '_'

Libindex /command

•       objdump  –T

libopt

Libopt hello_hide

Objdump –T elf

result

•       Libfoo.so   7895bytes ,  7887 bytes

•       Libfoob.so 7897bytes , 7,889 bytes

•       Hello  &hello_hide   8407 並沒有變化

•        通過版本控制指令碼--version-script=  libc.map 傳送到gcc並用-Wl 連結,便會隱藏不需要對外公開的函式符號.-Wl 是用來隔開兩引數反傳送到聯結器上的選項.

–   庫的利用者不能看到非公開的API

–   共享庫的符號表格變小了

–   降低了動態連結的開銷

c++ mapfile

{

    global:

       extern “C++”{

           some_class::some_func*

  };

  local:*;

}

other tool: mklibs.py: An automated way to create a minimal /lib/ directory.