何时实际使用 dlopen()? dlopen() 是指动态加载吗?

2024-03-08

我浏览了下面的链接,通过它我了解了如何创建和使用共享库。https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html

Step 1: Compiling with Position Independent Code
$ gcc -c -Wall -Werror -fpic foo.c

Step 2: Creating a shared library from an object file
$ gcc -shared -o libfoo.so foo.o

Step 3: Linking with a shared library
$ gcc -L/home/username/foo -Wall -o test main.c -lfoo

Step 4: Making the library available at runtime
$ export LD_LIBRARY_PATH=/home/username/foo:$LD_LIBRARY_PATH
$ ./test
This is a shared library test...
Hello, I am a shared library

但是,我有几个问题:

  1. 在给定的链接中,没有使用打开共享库所需的 dlopen()。这段代码在没有 dlopen() 调用的情况下如何工作?
  2. 何时实际使用 dlopen()?
  3. 我可以在没有 .so 文件可用的情况下编译程序(程序具有对该共享库的函数调用)吗?
  4. dlopen() 是否意味着动态加载,而上面链接中的示例(步骤 3)是否意味着静态加载?如果是,那么在动态加载的情况下,链接步骤(步骤3)有什么区别吗?

提前致谢。


动态库

当我们将应用程序链接到共享库时,链接器会留下一些存根(未解析的符号)以在应用程序加载时填充。这些存根需要在运行时或应用程序加载时由称为动态链接器的工具填充。

共享库的加载有两种类型,

  1. 动态链接库

这里,程序与共享库链接,内核在执行时加载该库(如果它不在内存中)。 这在提到的链接中进行了解释。

  1. 动态加载的库

对于创建“插件”架构很有用。 顾名思义,动态加载是指按需加载库并在执行期间链接。 程序通过调用库函数来完全控制。 这是使用 dlopen()、dlsym()、dlclose() 完成的。 dlopen() 函数打开一个库并准备使用。 通过此系统调用,可以打开共享库并使用其中的函数,而无需与其链接。你的程序刚刚启动,当它发现需要使用特定库中的函数时,它会调用 dlopen() 打开该库。如果该库在系统上不可用,则该函数将返回 NULL,并且由您(程序员)来处理。你可以让程序优雅地结束。

深度学习示例: 此示例加载数学库并打印 2.0 的余弦,并在每一步检查错误(推荐):

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {
    void *handle;
    double (*cosine)(double);
    char *error;

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

    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }

    printf ("%f\n", (*cosine)(2.0));
    dlclose(handle);
}

编译 DL 源代码时使用 -rdynamic。

前任。 gcc -rdynamic -o progdl progdl.c -ldl

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时实际使用 dlopen()? dlopen() 是指动态加载吗? 的相关文章

  • 链接对象文件时出现“未定义的引用”错误[重复]

    这个问题在这里已经有答案了 我意识到这个问题已经通过多种方式提出 包括这个非常全面的答案 https stackoverflow com questions 12573816 what is an undefined reference u
  • 为什么 JDBC 是动态加载而不是导入? [复制]

    这个问题在这里已经有答案了 在 JDBC 中 我只看到使用的示例 Class forName com mysql jdbc Driver true cl 还没有看到有人使用 import com mysql jdbc Driver 是不是因
  • 不清楚链接器的工作

    我在windows上使用C语言 这个问题以前是程序中的标识符会发生什么情况 https stackoverflow com questions 1986549 what happens to identifiers in a program
  • 了解静态链接嵌入式lua环境中lua扩展dll的构建/加载

    我有一个相对复杂的 lua 环境 我试图了解以下内容如何工作 起始设置包括以下两个模块 主要应用 无lua环境 DLL 静态链接到lua lib 包括解释器 该 dll 被加载到主应用程序中 并运行 lua 控制台解释器和可从控制台访问的
  • 为什么将 static libcurl.a 添加到 xcode 7.2 示例项目中会添加 libcurl.4.dylib 依赖项

    我一直试图通过将 libcurl a 添加到我的 Xcode 7 2 项目来消除对 libcurl 4 dylib 的任何依赖 我构建了一个全新的 libcurl 并将其放置在 usr local lib 中 标头位于 usr local
  • 如何从我的库中调用可执行文件中的函数?

    我有一个可执行文件和一个动态库 so 该库导出一些符号并且可执行文件成功调用它 但我想让库调用可执行文件的功能成为可能 我尝试在可执行文件中执行以下操作 test extern C void print const char str std
  • 对“lzma_code”的未定义引用

    我尝试打包我的应用程序并静态链接所有库 但我收到此错误 Makefile 如下所示 CC gcc INCPATH I home johnny Application FileBasedReG include RealityGrid LIBS
  • GNU 链接器 - 孤立部分和符号分配

    在阅读了足够多有关 GNU 链接器的文档后 我对结合有关实现自定义链接器文件的两个不同概念感到困惑 第一个概念是孤儿节 https sourceware org binutils docs ld Orphan Sections html O
  • Libsourcey 缺少 -fPIC 编译错误

    我正在尝试运行 LibSourcey 以使用 Webrtc 流服务器 问题是我似乎无法让它发挥作用 我努力在我的 Ubuntu 16 04 上 cmake 该项目 cmake 文件中的正则表达式 但现在它已修复 我实际上遇到的问题是编译时的
  • ns_initparse 的链接器错误

    这是代码 include
  • 修改编译共享库中符号的可见性

    我的项目依赖于一个第三方库 该库导出了更多应有的符号 其中一些符号被其他库和主程序无意地覆盖 如何更改已编译共享对象的函数和变量的可见性 如何更改已编译共享对象的函数和变量的可见性 您可以通过修改动态符号部分来更改符号的可见性 dynsym
  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 对常量数组的未定义引用

    a cpp const unsigned char whatever 123 a h extern const unsigned char whatever 123 b cpp include a h unsigned char x wha
  • 使用 g++ 从 cpp 文件和静态库创建共享库 [重复]

    这个问题在这里已经有答案了 就像标题所说 我想从三个 cpp 文件和一些静态库创建共享库 基本上我想这样做 g libProject so file1 cpp file2 cpp file3 cpp I usr local include
  • libicui18n.so.52:无法打开共享对象文件

    我一直在使用 libicu 来检测在 docker ubuntu 内部运行的节点应用程序中的字符集 这是通过模块完成的节点 icu 字符集检测器 https github com mooz node icu charset detector
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • 共享 Netbeans 项目

    我有一个在 Netbeans 中开发的 java 项目 因为我是唯一的开发人员 而且这是一个简单的项目 一个源文件 但它需要几个专业库 所以我没有使用源代码控制 我将不再参与该项目 并希望将其交给其他人 以防他们将来需要对其进行更改 我认为
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • 链接器问题 - 未定义的引用

    我的编译器有问题 告诉我有一个 未定义的引用 我想在库中使用的函数 让我分享一些有关该问题的信息 我正在用 gcc 交叉编译 C 语言 我正在调用一个库函数 该函数通过包含的标头访问 其中包含另一个标头 其中包含原型 我已经使用 I 包含了

随机推荐

  • 随机选择矩阵列

    我有一个m x n矩阵 我想在 MATLAB 中的一些神经网络应用程序中使用它 例如 A 24 22 35 40 30 32 42 47 45 39 14 1 10 5 9 2 8 4 1 8 我想随机训练一些列并测试其他剩余的列 因此 第
  • 尝试 rake db:migrate 时未在 Rails 项目中选择数据库

    使用 Rails 应用程序 遇到某种奇怪的数据库 rake 问题 当我执行时 rake db migrate 我收到以下错误 Mysql2 Error No database selected SHOW TABLES See full tr
  • Java中抛出匿名异常

    在 Java 中 即使只是在抛出时声明了异常 也有可能抛出任何异常 如下例 import org springframework dao DataAccessException DataAccessException is abstract
  • AChartEngine,单击时获取绘图值

    我使用 achartengine 编写了一个简单的时间表 我想要做的是通过单击图表上的点来获取已经绘制的值 这可能吗 假设 mChartView 是您的 GraphicalView mChartView setOnClickListener
  • XSL,使用 XML 作为模板的参数

    是否可以通过参数将 XML 传递到 XSL 模板 例如 下面我有模板body调用模板test1通过参数传递一些 XMLvar1 然后我尝试走到节点a使用 XPATH
  • Log4Net 多个记录器

    首先 我在其他主题中看到了很多答案和提示 最相似的是 Log4Net 多个记录器 https stackoverflow com questions 3470272 log4net multiple loggers 3513417 3513
  • xcode 在模拟器和设备上安装速度很慢

    在模拟器上 构建并运行 大约需要 30 秒 在设备上 构建并运行 大约需要 5 分钟 我 99 确信原因是我有很多图像 4000 80mb 构建本身阶段大约需要 2 秒 所以问题在于安装 有人有任何加快速度的建议吗 图像不需要改变 那么是否
  • C Linux:全局变量作为单例位于共享库中

    如果共享库 so 被多个进程使用 是否可以将位于共享库 so 中的全局变量用作单例 例如 初始值为 0 进程 1 递增 var 然后 proc2 递增 val 并打印它 到目前为止 我的实验表明 两个进程都保留变量的副本 如果第一个进程递增
  • Service Worker 即时声明页面的最佳实践

    由于应用程序和用户体验的性质 我目前设置了一名服务工作人员来立即认领该页面 由于此应用程序是从 AppCache 转换过来的 AppCache 为每个用户创建了一个动态清单文件 因此我发现最好的方法是将此清单文件解析为 JSON 数组并将其
  • Rubber 和 Amazon EC2 托管问题 (Net::SSH::AuthenticationFailed: root)

    我想在 Amazon EC2 服务器上托管我的 Ruby on Rails 应用程序 我正在关注橡胶和亚马逊 EC2 http railscasts com episodes 347 rubber and amazon ec2 view a
  • Jupyter 单元格标签:“remove-input”无效

    这是我的设置 我希望在运行笔记本时只看到 测试 一词 而没有代码单元 我对这个功能的理解正确吗 test ipynb print test In JupyterLab Property Inspector Cell Metadata col
  • 如何仅针对 Internet Explorer 7 以编程方式关闭 JavaScript?

    我想使用 JavaScript 和 或 jQuery 代码关闭 JavaScript 前提是在 IE7 中查看页面 如何才能做到这一点 将不胜感激神奇的代码片段 使用条件注释 http msdn microsoft com en us li
  • 在 VS 2008 和 IIS 中调试现有的 ASP.NET 应用程序

    我是一个 ASP NET 新手 我继承了 asp net mvc 代码的基础 为了帮助自己更好地适应面前的一堆源代码 我想在调试器中单步调试它 然而 作为微软平台的新手 我不知道如何解决这个问题 我们的应用程序在许多不同的主机名下提供内容
  • Flutter如何使用Future返回值作为变量

    我想要得到Future返回值并像变量一样使用它 我有这个Future功能 Future
  • 如何获得概率层的形状?

    我正在使用 TensorFlow 概率层构建模型 当我做 model output shape 我收到错误 AttributeError UserRegisteredSpec object has no attribute shape 如果
  • 如何将 JavaFX 导入 Eclipse?

    我有最新的 JDK 更新 65 但当我尝试导入 JavaFX 时 Eclipse 甚至无法识别它 我该如何解决这个问题并导入它 执行以下步骤 打开 Eclipse gt 帮助 gt Eclipse Marketplace 搜索 javafx
  • “const”错误之前的预期主表达式

    请帮忙 我收到很多错误 sub2 cpp 在函数 int main 中 sub2 cpp 11 14 错误 从 const char 到 char 的无效转换 fpermissive sub2 cpp 12 14 错误 从 const ch
  • box api 获取访问令牌时出错:无效的 grant_type 参数或参数丢失

    我正在尝试获取访问令牌并使用以下 url 来 POST HTTP 请求并接收 error invalid request error description Invalid grant type parameter or parameter
  • 验证 C 中的字符输入

    我有一个项目 我想验证 C 中的字符输入 我是 C 语言的新手 而且在编程方面也不是很有经验 我尝试创建一个循环进行验证 但它不起作用 include
  • 何时实际使用 dlopen()? dlopen() 是指动态加载吗?

    我浏览了下面的链接 通过它我了解了如何创建和使用共享库 https www cprogramming com tutorial shared libraries linux gcc html https www cprogramming c