В командной строке показана компиляция разделяемой библиотеки. Он экспортирует все функции и переменные, не объявленные «статическими», по дизайну, и это то, что требуется для создания общих объектов. Вы не можете скрыть все эти имена, не нарушая функциональность общего объекта, потому что другой объект, который загружает его, не может найти эти символы.
OTOH вы можете контролировать видимость большинства имен, используя, в буквальном смысле, параметры видимости gcc (-fvisibility=
) и атрибуты функции с тем же именем. Их обычно достаточно, чтобы контролировать то, что видно в экспорте библиотеки. Вы можете прочитать this book для подробного объяснения. (Кстати, почему вы используете -masm=intel
, если это не Windows?)
UPDATE [2013-12-27]: Пример:
$ cat t1.c
int t11(void)
{ return 11; }
int t12(void) __attribute__((visibility("hidden")));
int t12(void)
{ return 12; }
$ cat t2.c
int t21(void)
{ return t11()+10; }
int t22(void)
{ return t12()+10; }
$ cat t.c
int main() {
printf("%d %d %d\n", t11(), t21(), t22());
return 0;
}
$ cat Makefile
all: t
t: libtt.so
gcc -o t t.c libtt.so -Wl,-rpath=`pwd`
libtt.so: t1.c t2.c
gcc -o libtt.so -shared t1.c t2.c -fPIC
$ nm -D libtt.so | fgrep -w T
0000000000000598 T _fini
0000000000000438 T _init
0000000000000500 T t11
0000000000000520 T t21
0000000000000540 T t22
$ ./t
12 22 23
Вы можете увидеть библиотеку построен без неразрешенных системы предупреждений и бинарных трасс, но t12 не экспортируется. Если прокомментировать тело t12(), создание общей библиотеки будет успешным, но сбой выполнения исполняемого файла не удастся. Если добавить к исполняемому файлу результат t12(), соединение также завершится неудачей.
Вы можете просто удалить имена после факта. 'man strip' – cHao
@cHao Это не должно делать ничего' -s' еще не делает, если вы не ссылаетесь на некоторые конкретные варианты. – hvd
Вы говорите «моя программа», но вы фактически не создаете программу, вы создаете общую библиотеку. Если вы удаляете * все * имена из общей библиотеки, как кто-нибудь сможет ее использовать? Если вы хотите удалить * некоторые * имена, это может иметь смысл, но в этом случае вам, вероятно, следует изменить свой вопрос, чтобы включить соответствующую разницу между тем, что вы делаете и не хотите экспортировать. – hvd