无法从C中的其他模块访问Linux中共享库的自定义全局函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了无法从C中的其他模块访问Linux中共享库的自定义全局函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2584字,纯文字阅读大概需要4分钟。
内容图文
![无法从C中的其他模块访问Linux中共享库的自定义全局函数](/upload/InfoBanner/zyjiaocheng/956/91beae70b492454c930a803271083534.jpg)
我已经下载了libgcrypt库的源代码和
在一个特定文件中添加了我自己的自定义功能
虽然自定义共享库的编译/构建过程是成功的,但nm和objdump都显示
自定义函数是全局的,但它在链接时显示错误(未定义的引用).
这是我做的:
在/src/visibility.c文件里面,我添加了自定义函数,
void __attribute__((visibility("default"))) MyFunction(void)
{
printf("This is added just for testing purpose");
}
构建过程
./configure --prefix=/usr/local --disable-ld-version-script
sudo make install
nm和objdump命令将此自定义函数作为全局内部共享库查找.
nm /usr/local/lib/libgcrypt.so | grep MyFunction
000000000000fbf0 T MyFunction
objdump -t /usr/local/lib/libgcrypt.so | grep MyFunction
000000000000fbf0 g F .text 0000000000000013 MyFunction
这是我访问自定义函数的示例代码.
//gcrypt_example_test.c
#include <stdio.h>
#include <gcrypt.h>
#include <assert.h>
int main()
{
MyFunction();
return 0;
}
export LD_RUN_PATH=/usr/local/lib
gcc gcrypt_example_test.c -o test -lgcrypt
/tmp/ccA0qgAB.o: In function `main’:
gcrypt_example_test.c:(.text+0x3a2): undefined reference to `MyFunction’
collect2: error: ld returned 1 exit status
编辑1:
我尝试了所有可能的方法在头文件(/src/gcrypt.h)中包含函数原型声明,如下所示:
void __attribute__((visibility("default"))) MyFunction(void);
… 要么:
extern void __attribute__((visibility("default"))) MyFunction(void);
… 要么:
extern void MyFunction(void);
… 要么:
void MyFunction(void);
我仍然得到相同的错误(未定义的引用),虽然没有构建错误导致所有上述情况.
为什么会这样,我犯了什么错误?
虽然可以访问作为标准共享库的一部分并在visibility.c中定义的其他全局函数(nm也显示这些函数的T),但为什么我的共享库的自定义全局函数(MyFunction)仍然无法访问?谢谢!
任何解决此错误的链接或解释都将非常明显.
解决方法:
从the GCC documentation(强调我的):
Some linkers allow you to specify the path to the library by setting
LD_RUN_PATH
in your environment when linking.
-rpath=dir
Add a directory to the runtime library search path. This is used
when linking an ELF executable with shared objects. All -rpath
arguments are concatenated and passed to the runtime linker,
which uses them to locate shared objects at runtime. The -rpath
option is also used when locating shared objects which are needed
by shared objects explicitly included in the link; see the
description of the -rpath-link option. If -rpath is not used
when linking an ELF executable, the contents of the environment
variable "LD_RUN_PATH" will be used if it is defined.
请注意,根本没有提及链接时间库搜索路径.
您需要在链接时间库搜索路径中编译/链接/usr/local/lib:
gcc gcrypt_example_test.c -o test -L/usr/local/lib -lgcrypt
内容总结
以上是互联网集市为您收集整理的无法从C中的其他模块访问Linux中共享库的自定义全局函数全部内容,希望文章能够帮你解决无法从C中的其他模块访问Linux中共享库的自定义全局函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。