2016-09-21 200 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

那么,没有什么说的话......但重要的是用大号字母来标记它,因为没有人可以认为这是支持隐藏/不可访问库的一般程序。 –