簡體   English   中英

C++ 防止鏈接器丟棄函數

[英]C++ Prevent linker from discarding functions

我正在為 android 構建一個 C++ 庫。 我有 X.so 共享庫,它最終出現在 android 應用程序中,它是通過 JNI 訪問的。 我還有一個 Ya 靜態庫,它幾乎沒有 X.so 使用的通用函數。 Ya 也有一些 JNI 接口函數,應該可以被 android 應用程序訪問。 目前我遇到的問題是,在構建 Ya 之后,我可以看到所有需要導出的符號。 但是在將它鏈接到 X.so 之后,鏈接器會丟棄所有 JNI 接口函數,因為它們不在內部使用。 我嘗試了以下 2 個選項,但沒有任何運氣,

1.

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL myImportantFunction(JNIEnv*, jclass);
.
.
.

void* volatile tmp = (void*)&myImportantFunction;
#ifdef __cplusplus
}
#endif

2.

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void __attribute__((used)) JNICALL myImportantFunction(JNIEnv*, jclass);
.
.
.

#ifdef __cplusplus
}
#endif

如果有任何叮當屬性或黑客可以強制鏈接器不要丟棄我需要的特定功能(當我構建 Ya 時),那將是理想的。 感謝大家在這方面的任何幫助。

如果你想保留整個Ya ,那么-Wl,--whole-archive -lY -Wl,--no-whole-archive確實是要走的路。

如果您只想保留Ya特定符號,但讓鏈接器丟棄其他(未使用的)目標文件,那么您需要告訴鏈接器使用了這些函數,如下所示:

g++ -u myImportantFunction x1.o x2.o ... -lY -shared -o X.so

暫無
暫無

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

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