Tag: 动态库

使用libdl在C中的插件架构

我一直在玩弄,在C中编写一个小型IRC框架,我现在将扩展其中一些核心function – 但除此之外,我希望它可以通过插件进行扩展! 到目前为止,每当我写一些IRC相关的东西(我写了很多东西,现在大约有6种不同的语言……我很着火!)并且实际上继续实现了一个插件架构,它是在一种解释性的语言中有设施(读:滥用)所以,就像在Ruby中干扰整个脚本文件一样(糟糕!)。 现在我想在C中滥用一些东西! 基本上我可以做三件事 在我的程序中定义一个简单的脚本语言 使用现有的,嵌入一个解释器 使用libdl在运行时加载* .so模块 我喜欢第三个,如果可能的话,请避开其他两个选项。 也许我是某种forms的受虐狂,但我认为这对于学习目的来说既有趣又有用。 逻辑思考,明显的“痛苦链”将是(从最低到最高)2 – > 1 – > 3,原因很简单,因为libdl正在处理原始代码,这些代码可能(并且将会)在我的脸上爆炸。 所以这个问题告诉你,stackoverflow的其他用户,你认为libdl能胜任这个任务,甚至是一个现实的想法吗?

全局变量,共享库和-fPIC效果

我制作了一段代码,它包含一个动态库( lib.c )和一个主可执行文件( main.c )。 在这两个文件中,我定义了一个名为: int global的全局变量。 不是很聪明,但这不是问题。 当我编译动态库时, -fPIC选项似乎是强制性的: gcc lib.c -fPIC -shared -o lib.so 否则我得到: /usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against ‘.rodata’ can not be used when making a shared object; recompile with -fPIC 当我编译可执行文件时,它不是。 gcc main.c -fPIC -ldl gcc main.c -ldl 两者都有效,但有不同的行为,我无法解释,是吗? : 使用-fPIC,main.c中的global和lib.c中的global是相同的变量: global main: 23 (0x601050) global lib: 23 (0x601050) […]