GNU ld
может делать это на платформах ELF.
Вот как это сделать с помощью скрипта версии компоновщика:
/* 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 '
По умолчанию экспортируются все символы:
0000000000000718 T _fini
00000000000005b8 T _init
00000000000006b7 T bar
00000000000006c9 T baz
00000000000006ac T foo
Допустим, вы хотите экспортировать только bar()
и baz()
. Создайте «скрипт версии» 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