c - 基于 unix 的系统中的延迟加载等效项

标签 c unix object linker shared

在基于 unix 的系统中,什么是延迟加载

我有一个代码 foo.cpp,在用 gcc 编译时我将它链接到共享对象(总共有三个 .so 文件。)。每个 .so 文件都有不同的选项。

./foo -v 需要 libversion.so ./foo -update 需要 libupdate.so

我需要那些库的符号应该只在运行时解析。

./foo -v 即使没有 libupdate.so 库也不应该中断。

它在 Windows 中使用延迟加载选项(在 dll 的属性中)工作。它在 unix 系统中的等价物是什么。

-lazy 选项会在 UNIX 中做同样的事情吗?如果是这样,在哪里包含此选项:在 makefile 中还是使用链接器 ld?

最佳答案

请参阅系统上有关 dlopen() 的引用资料。您可以在运行时而不是链接时手动打开库并解析外部符号。

挖出一个例子:

int main(int argc, char **argv) {                 
    void *handle=NULL;                                 
    double (*myfunc)(double);                     
    char *err=NULL;                                  

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY);
    if (!handle) {                                
        err=dlerror();
        perror(err);
        exit(1);                                  
    }                                             

    myfunc = dlsym(handle, "sin");                
    if ((err = dlerror()) != NULL)  {           
        perror(err);
        exit(1);                                  
    }                                             

    printf("sin of 1 is:%f\n", (*myfunc)(1.));              
    dlclose(handle);            
    return 0;                  
}                                                 

关于c - 基于 unix 的系统中的延迟加载等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957292/

相关文章:

javascript - 如何检查数组对象在 for 循环中是否完成

C 第一个字母大写忽略第一个单词

c - C 中的函数参数在函数调用后未修改

linux - 1 小时前修改的文件列表

unix - 转换补丁条级别

php - 获取 protected 对象中的字符串

c - 从动态链表中删除节点

c - glibc/realloc/无效指针

c - 使用C旋转BMP图像

java - 从Java中其他类的对象列表中获取对象列表