2016-09-21 78 views
0

我必須使用另一個靜態庫構建共享庫。在該靜態庫中,有一些函數調用在nm output中未定義。我想通過獲取目標文件來刪除這些符號。我無法刪除整個對象文件,因爲它的一部分被使用。有沒有辦法做到這一點。如何從.o文件中刪除未定義的符號

nm output

request.o: 
     U CLR_SECURE_MEM_START_ADDR //want to remove 
     U clrSMEMAlloc    //want to remove 
     U clrSMEMCopy     //want to remove 
     U clrSMEMFree     //want to remove 
     U clrSMEMSet     //want to remove 
00000000 T copyBuffer 
00000000 T copyParameter 
00000000 T copyRequest 
00000000 T freeParameter 
00000000 T freeRequest 
00000000 T getLinkFromRequest 
     U _gp_disp 
00000000 T initializeRequest 
00000000 T initializeRequestQueue 
     U isClrSMEMBuffer 
00000000 T isParamInSharedMem 
00000000 T isRequestInSharedMem 
00000004 b RequestQueue 
00000000 b RequestQueueHead 
     U strlen 
00000000 T verifyParameter    ////want to keep 
00000000 T verifyParameterType 
00000000 T verifyParameterTypes 
00000000 T verifyRequestParameters 

我沒有這個目標文件的來源,所以我不知道,我想刪除函數的原型。如果我有源碼,我可以編寫虛擬定義。 P.S 我的圖書館壞了。這就是爲什麼我有未定義的參考。

+0

你不需要知道的虛擬函數的原型,因爲他們從來沒有真正被調用。 –

+0

是的。正確。我使用了虛擬功能和它的工作。 –

+0

你只需要確保這些虛擬函數實際上從來沒有被任何人調用過。 –

回答

1

根據Michael Walz的評論,我不需要去除.o文件。我只需要創建一個文件depend.c。爲那些未定義的函數定義一個定義。然後建立它

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libdepend 
LOCAL_SRC_FILES := src/depend.cpp 

LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../RIP/include/ $(LOCAL_PATH)/../../../hardware/libhardware/include/hardware $(LOCAL_PATH)/../../../hardware/libhardware/include $(LOCAL_PATH)/src $(LOCAL_PATH)/../../RIP/inc 

LOCAL_SHARED_LIBRARIES = libsmem.sastra 

LOCAL_LDFLAGS := -v -L$(ANDROID_PRODUCT_OUT)/system/lib -lsmem.$(TARGET_BOARD_PLATFORM) -L$(LOCAL_PATH)/../../RIP/library -llibrary -llog -lcutils -lipc.$(TARGET_BOARD_PLATFORM) 

#this option will build executables instead of building library for android application. 
include $(BUILD_EXECUTABLE) 

取出來,從這個文件夾中文件的的.o。 從庫中獲取所有.os。 現在

ar -x library.a //get original object files 

包通過這個命令

ar r library.a *.o //put depend.o with other object files 

現在,在這個庫depend.o所有.os建立共享庫

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libRip 
LOCAL_SRC_FILES := src/Rip_api.cpp src/Rip_crypto.cpp 

LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v 

#only include corelockr and rip headers 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc/ $(LOCAL_PATH)/include/ $(LOCAL_PATH)/../../hardware/libhardware/include/hardware/ 

LOCAL_LDLIBS := -llog -L$(LOCAL_PATH)/library -llibrary 
LOCAL_SHARED_LIBRARIES = libsmem.sastra 
#test seqr library 
#LOCAL_LDFLAGS := -v -L$(LOCAL_PATH)/library -llibrary 

#this option will build static library 
include $(BUILD_SHARED_LIBRARY) 

現在,共享庫應該建立一個沒有任何問題。

*******它的解決方法,而不是一個真正的解決方案。*******

+0

事實上,您正在消除依賴關係,但是會爲這些依賴項引入虛假實現,並且通常會導致該庫損壞。 **只有當你完全知道你在做什麼** –

+0

是的,這樣做後圖書館被打破。一個詞已發送給開發圖書館的人,並要求回答未定義的參考文獻。與此同時,這些錯誤的實現,解釋了我的測試應用程序的工作,目前它更重要。 –

+0

那麼,沒有什麼說的話......但重要的是用大號字母來標記它,因爲沒有人可以認爲這是支持隱藏/不可訪問庫的一般程序。 –