Мне немного непонятно, как скрыть символы в статических библиотеках из среды командной строки linux на основе предыдущих ответов, поэтому я просто опубликую свое решение здесь для потомков (учитывая, что это один из лучших результатов наGoogle для этого вопроса).
Допустим, у вас есть эти два файла .c:
// f1.c
const char *get_english_greeting(void)
{
return "hello";
}
__attribute__((visibility("default")))
const char *get_greeting(void)
{
return get_english_greeting();
}
и
// f2.c
#include <stdio.h>
const char *get_english_greeting(void);
__attribute__((visibility("default")))
void print_greeting(void)
{
puts(get_english_greeting());
}
Вы хотите преобразовать эти два файла вСтатическая библиотека экспортирует как get_greeting
, так и print_greeting
, но не get_english_greeting
, который вы не хотите делать статическим, поскольку вы хотели бы использовать его в своей библиотеке.
Вот шаги для достижения этого:
gcc -fvisibility=hidden -c f1.c f2.c
ld -r f1.o f2.o -o libf.o
objcopy --localize-hidden libf.o
ar rcs libf.a libf.o
Теперь это работает:
// gcc -L. main.c -lf
void get_greeting(void);
void print_greeting(void);
int main(void)
{
get_greeting();
print_greeting();
return 0;
}
И это не так:
// gcc -L. main.c -lf
const char *get_english_greeting(void);
int main(void)
{
get_english_greeting();
return 0;
}
Для последнего вы получите эту ошибку:
/tmp/ccmfg54F.o: In function `main':
main.c:(.text+0x8): undefined reference to `get_english_greeting'
collect2: error: ld returned 1 exit status
Что нам и нужно.
Обратите внимание, что имена скрытых символов все еще видны в статической библиотеке, но компоновщик откажется связываться с ними вне указанной статической библиотеки.Чтобы полностью удалить названия символов, вам нужно раздеть и запутать.