簡體   English   中英

如何管理共享庫中的未定義符號

[英]how to manage undefined symbols in a shared library

我有一個共享庫,其中包含未定義的符號

JNI_CREATEJavaVM

有什么辦法可以包含外部依賴項或告訴編譯器忽略該符號?

是的,您可以告訴編譯器忽略該符號。

man ld

--unresolved-symbols =方法

確定如何處理未解析的符號。 方法有四個可能的值:

   ignore-all
       Do not report any unresolved symbols.

   report-all
       Report all unresolved symbols.  This is the default.

   ignore-in-object-files
       Report unresolved symbols that are contained in shared
       libraries, but ignore them if they come from regular object files.

   ignore-in-shared-libs
       Report unresolved symbols that come from regular object
       files, but ignore them if they come from shared libraries.

1)我認為(打開電話模式)您正在嘗試構建libdvm.so並繞過Java NDK進行破解,但不會公開JNI_CREATEJavaVM函數。 不要這樣 去和谷歌為什么不呢,還有其他可能的解決方案。

2)由於您的問題聽起來像是“如何管理”,因此我將介紹我最喜歡的方法來處理此類問題-通過引入偽造的弱定義。 讓我們逐步構建共享庫,因為構建什么確實無關緊要。 考慮我們有一些帶有代碼的undesym.c文件:

int
main(void)
{
  JNI_CREATEJavaVM();
  return 0;
}

它產生undefined reference to `JNI_CREATEJavaVM'錯誤的undefined reference to `JNI_CREATEJavaVM'

讓我們使用假的弱存根添加到鏈接模塊fakeone.c:

#include "assert.h"

int  __attribute__((weak))
JNI_CREATEJavaVM(void)
{
  assert(0 == "stub JNI_CREATEJavaVM is not for call");
  return 0;
}

現在一切正常,但是在存根調用中會生成運行時斷言

a.out: fakeone.c:6: JNI_CREATEJavaVM: Assertion `0 == "stub JNI_CREATEJavaVM is not for call"' failed

但是為什么它很弱? 因為考慮到有人將其與實際的JNI_CREATEJavaVM代碼鏈接。 例如,嘗試goodone.c

#include "stdio.h"

int
JNI_CREATEJavaVM(void)
{
  printf("JNI_CREATEJavaVM Ok\n");
  return 0;
}

然后編譯gcc undesym.c goodone.c fakeone.c現在正確的定義將覆蓋弱存根,您將獲得正確的消息。

當然,您必須設法避免使用這種技術,但是它對我有很多幫助。

暫無
暫無

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

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