簡體   English   中英

使用GCC,如何僅導出靜態庫中的某些功能?

[英]With GCC, how do I export only certain functions in a static library?

我在GCC中創建了一個靜態庫,但是我想隱藏大部分符號。

例如,test1.c:

extern void test2(void);
void test1(void) {
  printf("test1: ");
  test2();
}

test2.c中:

extern void test1(void);
void test2(void) {
  printf("test2\n");
}

library_api.c:

extern void test1(void);
extern void test2(void);
void library_api(void) {
  test1();
  test2();
}

現在編譯:

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc -c library_api.c -o library_api.o
ar rcs libapi.a test1.o test2.o library_api.o

如何僅顯示“library_api()”函數以顯示:

nm libapi.a

而不是函數“test1()”,“test2()”和“library_api()”? 換句話說,如何隱藏“test1()”和“test2()”從顯示和可調用到libapi.a的外部用戶? 我不希望外部用戶知道任何有關內部測試功能的信息。

最簡單的解決方案是#include test1.c和test2.c到library_api.c ,並且只編譯該文件。 然后你可以使test1()和test2()靜態。

或者,您可以將目標文件與ld -r組合使用,並使用objcopy --localize-symbols在鏈接后使測試函數保持靜態。 由於這可能相當繁瑣,我真的推薦第一個選項。

ld有選擇權

--retain-symbols-file FILE僅保留FILE中列出的符號

允許您明確命名要保留的符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM