c - 如何从 .o 文件中删除 undefined symbol

标签 c shared-libraries undefined-reference

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

纳米输出

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

我没有这个目标文件的源代码,所以我不知道我想要删除的函数的原型(prototype)。如果我有源代码,我可以编写虚拟定义。 附言 我的图书馆坏了。这就是为什么我有 undefined reference 。

最佳答案

根据 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)

从 out 文件夹中获取该文件的 .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)

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

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

关于c - 如何从 .o 文件中删除 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39610857/

相关文章:

c - 如何查找 ELF 文件的 .dynamic 部分中的条目数?

c - 在 Mac OS X 上将 GNU 科学库链接到 R

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c - 是否可以在不使用第三方库的情况下在运行时告诉 C 中整数类型有多少字节

c++ - 如何阻塞直到 WiringPi 完成发送串行数据(UART)?

c++ - QtPlugins 实现多个接口(interface)并转换为通用接口(interface)

c++ - g++ "undefined reference"错误

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c - 从文件中删除注释并在控制台上打印

c++ - 如何使用另一个版本的库