`-rdynamic` 到底有什么作用以及什么时候需要它?

2024-01-08

到底是做什么的-rdynamic (or --export-dynamic在链接器级别)做什么以及它如何与定义的符号可见性相关-fvisibility*标志或可见性pragmas and __attribute__s?

For --export-dynamic, ld(1) http://linux.die.net/man/1/ld提到:

... 如果您使用“dlopen”加载需要引用的动态对象 程序定义的符号,而不是其他动态的 对象,那么你可能需要 在链接程序本身时使用此选项。 ...

我不确定我是否完全理解这一点。您能否提供一个没有以下情况就无法工作的示例-rdynamic但用它呢?

Edit: 我实际上尝试编译几个虚拟库(单文件、多文件、各种 -O 级别、一些函数间调用、一些隐藏符号、一些可见),有或没有-rdynamic,到目前为止我已经得到字节相同输出(当然,当所有其他标志保持不变时),这非常令人费解。


下面是一个简单的示例项目来说明使用-rdynamic.

bar.c

extern void foo(void);

void bar(void)
{
    foo();
}

main.c

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

void foo(void)
{
    puts("Hello world");
}

int main(void)
{
    void * dlh = dlopen("./libbar.so", RTLD_NOW);
    if (!dlh) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE); 
    }
    void (*bar)(void) = dlsym(dlh,"bar");
    if (!bar) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE); 
    }
    bar();
    return 0;
}

Makefile

.PHONY: all clean test

LDEXTRAFLAGS ?=

all: prog

bar.o: bar.c
    gcc -c -Wall -fpic -o $@ $<

libbar.so: bar.o
    gcc -shared -o $@ $<

main.o: main.c
    gcc -c -Wall -o $@ $<

prog: main.o | libbar.so
    gcc $(LDEXTRAFLAGS) -o $@ $< -L. -lbar -ldl

clean:
    rm -f *.o *.so prog

test: prog
    ./$<

Here, bar.c成为共享库libbar.so and main.c变成 一个程序dlopens libbar并打电话bar()从那个图书馆。bar() calls foo(),这是外部的bar.c并定义在main.c.

所以,没有-rdynamic:

$ make test
gcc -c -Wall -o main.o main.c
gcc -c -Wall -fpic -o bar.o bar.c
gcc -shared -o libbar.so bar.o
gcc  -o prog main.o -L. -lbar -ldl
./prog
./libbar.so: undefined symbol: foo
Makefile:23: recipe for target 'test' failed

-rdynamic:

$ make clean
rm -f *.o *.so prog
$ make test LDEXTRAFLAGS=-rdynamic
gcc -c -Wall -o main.o main.c
gcc -c -Wall -fpic -o bar.o bar.c
gcc -shared -o libbar.so bar.o
gcc -rdynamic -o prog main.o -L. -lbar -ldl
./prog
Hello world
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`-rdynamic` 到底有什么作用以及什么时候需要它? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • gcc,我可以将 offsetof() 与指向成员的模板化指针一起使用吗?

    下面的代码在这里 https ideone com XnxAyw https ideone com XnxAyw 我得到的编译器错误是 prog cpp In member function size t list base
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • _SESSION 变量不起作用

    我有一个 PHP 脚本 我尝试在 HTML 标头开始之前获取会话变量 如果我使用 SESSION变量位于 HTML 正文中的某个位置 由于某种原因它可以工作 但如果我使用 SESSION变量在 HTML 开始之前 我无法从中获取值 有人知道
  • MapReduce作业的Map阶段的输出总是排序的吗?

    我对从 Mapper 获得的输出有点困惑 例如 当我使用以下输入文本运行一个简单的字数统计程序时 hello world Hadoop programming mapreduce wordcount lets see if this wor
  • Selenium.click 对某些锚元素不起作用

    我正在开发的应用程序最近进行了改进 作为其中的一部分 引入了新的 JQuery 日历 我需要单击日历中的链接来选择时间和日期 但是 Selenium click 不起作用 命令被执行 但屏幕上没有任何反应 为了检查我的 XPATH CSS
  • 如何使用 pg-promise 将 jsonb[] 数据插入列

    给定一个包含 type 列的表jsonb 如何将 json 数组插入到列中 使用提供的格式化程序 array json在这种情况下不起作用 除非我错过了正确的组合或其他东西 const links title IMDB url https
  • bootstrap-typeahead.js 在 select 事件上添加监听器

    我是 Bootstrap Twitter 框架的新手 我需要使用 bootstrap typeahead js 进行自动完成 但我还需要获取用户为 typeahead 选择的值 这是我的代码
  • 对于 std::generate,传递的函数可以使用索引吗?

    问题有点难以表达 所以我将举一个例子 可以说我这样做 generate myvec begin myvec end func 我可以拥有它 以便 function 可以读取生成的索引吗 int func if index lt 2 retu
  • Gson 有类似 @JsonProperty 的方法吗?

    Jackson 有 JsonProperty name 注释 可以应用于方法 方法的返回值将分配给 JSON 中的 name 参数 我发现 Gson 有 SerializedName 注释 但不能与方法一起使用 有没有办法获得 Gson 中
  • 使用嵌入式互操作类型时发出警告

    我最近将我的 C 解决方案之一从 VS2008 更新到 VS 2010 以利用嵌入式互操作类型功能 这样我就可以停止提供目前由于与旧版 VB6 代码库交互而必须使用的互操作库 由于某种原因 我在编译解决方案时收到以下消息 类型库导入程序遇到
  • 带有 GigE 视觉相机的 OpenCV [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Google 地图 v3 自动刷新 仅标记

    我正在使用 Google 地图 V3 来显示一些图钉 我希望能够刷新标记而不影响您在地图上的位置或缩放级别 我希望标记每 x 秒更新一次 我该怎么做呢 我对 jQuery ajax 没有太多经验 我的地图的工作示例如下 http jsfid
  • Python Pillow 的缩略图方法返回 None

    我有一个小脚本 用于使用 Python 的 Pillow 库批量调整图像大小 该脚本适用于调整大小方法 但是纵横比的变化会扭曲图像 因此我尝试使用缩略图方法测试相同的脚本 我很困惑 因为从文档和其他堆栈问题看来 我可以将调整大小方法替换为缩
  • 为什么我的 UDP 客户端/服务器数据报无法进行双向通信?

    我在两个应用程序之间设置了一个简单的 UDP 客户端 服务器数据报 Android Java Client 和 Windows C Server 这是我第一次使用 Java 编程和 Android 应用程序 因此解决方案可能是显而易见的 这
  • 如何获取服务中当前登录的用户

    在 Symfony 2 8 3 0 中 使用我们精美的新安全组件 我如何获取当前记录的User 即 FOSUser 服务中的对象without注入整个容器 是否有可能在非黑客方式 PS 我们不要考虑 将其作为参数传递给服务函数 因为这是显而
  • 使用 pdfbox 解析文件内容时使用后备字体 - 会导致错误吗?

    我正在使用 Apache Tika 1 14 它使用 pdfbox 2 0 3 我用它来提取文件的文本内容 在生产模式下 当处理许多文件时 我会记录许多如下语句 WARN o a p pdmodel font PDTrueTypeFont
  • 每次击键后 Xcode 都会继续构建故事板

    我使用故事板的 Xcode 项目最近进入了一种非常奇怪的状态 Xcode 不断构建整个项目 特别是之后的故事板每次按键 我没有发现这种行为的原因 无论是在我的项目中比较所有有趣的文件 故事板和项目 还是Xcode中的设置 也许我只是找不到它
  • 如何在 Apache 服务器中部署 Web 应用程序 Aurelia?

    为了进行尝试 我使用了最新的 aurelia sculpture navigation 1 0 0 beta 1 0 1 为了在 Apache 服务器中部署 Aurelia Web 应用程序 我使用了 gulp export 命令 并将 e
  • 滚动后颤动 ListView KeepAlive

    我想要keepAlive我的小部件已经渲染在ListView 我被尝试过addAutomaticKeepAlives true提供的属性ListView class 这是我使用的示例代码 同样的问题在SliverChildBuilderDe
  • htaccess 密码保护,但不在本地主机上

    我已经建立了一个开发网站 并希望对其进行密码保护 以便只有经过验证的访问者才能查看该网站 一切都很好 我很恼火 在我的本地版本上输入我的用户名和密码 那么 在不更改本地副本和开发站点上的 htaccess 文件之间的情况下 如何使用密码保护
  • 节点获取仅返回待处理的承诺

    我正在尝试node fetch我得到的唯一结果是 Promise
  • `-rdynamic` 到底有什么作用以及什么时候需要它?

    到底是做什么的 rdynamic or export dynamic在链接器级别 做什么以及它如何与定义的符号可见性相关 fvisibility 标志或可见性pragmas and attribute s For export dynami