如何从 .o 文件中删除未定义的符号

How to remove undefined symbols from a .o file

提问人:pointer accurate 提问时间:9/21/2016 最后编辑:pointer accurate 更新时间:9/23/2016 访问量:1547

问:

我必须使用另一个静态库构建一个共享库。在该静态库中,有一些函数调用在 中未定义。我想通过获取对象文件来删除这些符号。我无法删除整个对象文件,因为它的某些部分已被使用。有什么办法可以做到这一点。nm output

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 我拥有的图书馆坏了。这就是为什么我有未定义的参考。

c 共享库 未定义引用

评论

0赞 Jabberwocky 9/21/2016
您不需要知道虚拟函数的原型,因为它们从未实际调用过。
0赞 pointer accurate 9/21/2016
是的。正确。我使用了虚拟函数及其工作原理。
0赞 Jabberwocky 9/21/2016
你只需要确保这些虚拟函数实际上从未被任何人调用过。
0赞 pointer accurate 9/21/2016
是的。我明白了。这就是为什么在我的回答中,我写道这是一种解决方法。在我的情况下,这些函数没有被调用。

答:

2赞 pointer accurate 9/21/2016 #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

通过以下命令将此库中的所有 .os 与 depend.o 打包在一起

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

现在构建共享库

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)

现在共享库应该可以毫无问题地构建。

这是一种解决方法,而不是真正的解决方案。

评论

1赞 Luis Colorado 9/21/2016
事实上,您正在消除依赖项,但为这些依赖项引入了错误的实现,并且您通常会损坏该库。只有当你绝对知道你在做什么时才去做
0赞 pointer accurate 9/21/2016
是的,这样做后库被破坏了。已向开发库的人发送了一条消息,并要求回答未定义的参考文献。同时,这些错误的实现解释了我的测试应用程序的工作,目前它更为重要。
0赞 Luis Colorado 9/21/2016
好吧,当时什么也没说......但是用大写字母标记它很重要,因为没有人可以认为这是支持隐藏/无法访问的库的一般过程。
0赞 pointer accurate 9/22/2016
编辑了最后一条评论,使其更明显。