linux编译时-ldl,编译和链接C文件时关于-ldl标志
参考以下代码
test_linker.cpp
int main() {
srand(time(0));
for (int i = 0; i < 10; ++i) {
cout << rand() % 10 << endl;
}
return 0;
}
urandom.cpp
#include
using std::cout;
using std::endl;
#include
int rand() throw() {
// get the original rand() function
static auto original_rand = (decltype(&rand)) dlsym(RTLD_NEXT,"rand");
cout << "Call made to rand()" << endl;
return original_rand();
}
当我尝试使用以下命令编译代码时
g++ -std=c++11 -Wall -Werror -Wextra -Wvla -pedantic -O3 urandom.cpp -c
g++ -std=c++11 -Wall -O3 test_linker.cpp urandom.o -ldl
一切正常,但是当我将-ldl标志移动到文件之前时,链接器会抛出一个错误说
urandom.cpp:(.text+0xaf): undefined reference to `dlsym'
问题1有人可以解释为什么会这样吗?我通常不关心编译命令中的标志顺序.
问题2将原始rand()函数的函数指针保持为静态变量也是错误的吗?我不知道动态链接是如何工作的,我担心函数地址可能会在运行时在内存中移动.手册页说,带有RTLD_NEXT句柄的dlsym()函数是一个昂贵的计算,所以我只想懒洋洋地评估一次.
注意:我正在Linux发行版上编译它,并且涉及Linux动态链接器,因此我将继续使用Linux进行标记.
解决方法:
-ldl是链接器的库名称.它告诉链接器查找并链接名为libdl.so(或有时是libdl.a)的文件.它与在命令行的相同位置放置相关库的完整路径具有相同的效果.
命令行上的库和对象顺序很重要.通常,如果库A调用库B,则应将B放在命令行中的A之后.所有库通常应该遍历所有目标文件.这在几个SO问题和答案中被广泛涵盖,如this one.
至于第二个问题,不,函数的地址在运行时不会改变,除非您打开共享库,然后卸载它,然后再次执行它.在您的情况下,由于您没有dlopen库,因此将函数地址保存在静态变量中是安全的.当然,如果你运行多个线程,你需要以某种方式确保线程安全(互斥它,或使用线程本地存储).
标签:c-2,linux,c11,dynamic-linking
来源: https://codeday.me/bug/20190519/1135714.html
linux编译时-ldl,编译和链接C文件时关于-ldl标志相关推荐
- Linux中磁盘还有空间,但创建文件时提示空间不足
首先需要知道创建文件时,需要满足两个条件: 1.磁盘上还有空间: 2.inode号还有剩余. 这两个条件可以分别使用"df -h"以及"df -i"查看使用情况 ...
- php获取音频的时长,PHP编程获取音频文件时长的方法【基于getid3类】
本文实例讲述了PHP编程获取音频文件时长的方法.分享给大家供大家参考,具体如下: 问题: 昨天在新增论坛功能的时候,移动端显示音频文件需要知道是多长的音频: 具体解决方案如下: 首先就是数据库中增加保 ...
- 打印时显示预服务器,Win7打印文件时提示Active Directory域服务当前不可用
Win7系统操作中,不少用户在打印文件的时候遇到了"Active Directory域服务当前不可用"错误提示,对文件的打印造成了不必要的麻烦,遇到这个错误提示该如何处理呢?小编给 ...
- linux重定向文件容加时间,linux – 如何在Bash中将stdout重定向到文件时添加时间戳?...
我有一个程序(服务器),我正在寻找一种方法(脚本),将所有的stdout重定向(或更好地复制)到文件并为每个条目添加时间戳. 我做了一些研究,我能得到的最远的是得益于How to add timest ...
- 【Word】Word运行时提示“Word在试图打开文件时遇到错误”的解决办法
今天突然遇到下载的带有 .doc文件使用office 2013打开时这个问题:见下图 经多次查找资料,找到一种解决方法如下: 点击 文件 里面有个选项: 再点击 信任中心----信任中心设置 如下图: ...
- 【Jenkins】通过ANT构建JMeter任务时提示找不到jtl文件时的解决方法
转载于:https://www.cnblogs.com/xiongjiawei/p/6547507.html
- c语言读文件时 fgetc,[求助]用fgetc()读取文件时遇到的问题~~
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 文件input.txt Today is sunday. Our beautiful pools had turned brownish ...
- idea查看java文件编码_Intellij Idea编译项目下的.java文件时的编码问题
由<编译.java文件时的编码问题>可知,在编译.java文件的时候,需要正确指定一个编码方案,该编码方案用于解码.java文件的字节流. 那么在使用Intellij Idea编译(假定使 ...
- Linux下创建硬链接,文件访问为空,提示:xxxx: 符号连接的层数过多
Linux下创建软链接|硬链接,文件访问为空,提示:x x x: 符号连接的层数过多. 原因:创建符号链接的时候未使用绝对路径,无论是源文件路径还是目标路径,都需要使用绝对路径. 如: ln -s / ...
最新文章
- Logback中使用TurboFilter实现日志级别等内容的动态修改
- apache的防DDOS模块-mod_evasive
- 数据中台(一)数据资源规划与获取
- filezilla 设置filezilla使用明文密码_详解WordPress使用FTP上传主题和插件
- 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
- CF449B Jzzhu and Cities(Dijkstra)
- wordpress 根据文章ID获取分类ID和标签ID
- [Leedcode][JAVA][第460题][LFU]
- Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?
- 动与静--软件的雕塑艺术
- 【渝粤教育】电大中专消费者行为学_1作业 题库
- UVA12307 Smallest Enclosing Rectangle 题解
- Specular mode: Specular parameter 高光模式:高光参数 Standard Shader系列7
- mike21 matlab tools,MIKE21学习软件
- solaris linux 计算磁盘容量 cyl alt sec
- TSNAdb:肿瘤新抗原数据库
- 《宣龙教育》加密网课视频下载
- MSSQL 注入鄙见
- 从业多年数据分析师的亲身经验!
- 微信里的小程序怎么制作