gpt4 book ai didi

c - 如何管理共享库中的 undefined symbol

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:35 25 4
gpt4 key购买 nike

我有一个有 undefined symbol 的共享库

JNI_CREATEJavaVM

有什么方法可以包含外部依赖项或告诉编译器忽略该符号吗?

最佳答案

1) 我认为(开启心灵感应模式)您正在尝试构建 libdvm.so 并破解 Java NDK,这不会公开 JNI_CREATEJavaVM 函数。不要这样做。去谷歌搜索为什么不,还有其他可能的解决方案。

2) 由于您的问题听起来像是“如何管理”,因此我将介绍我最喜欢的管理此类事情的方法——引入假的弱定义。让我们着手构建共享库,因为我们构建什么并不重要。假设我们有一些带有代码的 undesym.c 文件:

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

它会产生 undefined reference to `JNI_CREATEJavaVM' 错误。

让我们添加到链接模块 fakeone.c 和假的弱 stub :

#include "assert.h"

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

现在一切链接正常,但 stub 调用会产生运行时断言

a.out: fakeone.c:6: JNI_CREATEJavaVM: 断言 `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现在正确的定义会覆盖弱 stub ,您将得到正确的消息。

当然你必须尽量避免这种技术,但它帮助了我好几次。

关于c - 如何管理共享库中的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14555933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com