参考以下代码

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标志相关推荐

  1. Linux中磁盘还有空间,但创建文件时提示空间不足

    首先需要知道创建文件时,需要满足两个条件: 1.磁盘上还有空间: 2.inode号还有剩余. 这两个条件可以分别使用"df -h"以及"df -i"查看使用情况 ...

  2. php获取音频的时长,PHP编程获取音频文件时长的方法【基于getid3类】

    本文实例讲述了PHP编程获取音频文件时长的方法.分享给大家供大家参考,具体如下: 问题: 昨天在新增论坛功能的时候,移动端显示音频文件需要知道是多长的音频: 具体解决方案如下: 首先就是数据库中增加保 ...

  3. 打印时显示预服务器,Win7打印文件时提示Active Directory域服务当前不可用

    Win7系统操作中,不少用户在打印文件的时候遇到了"Active Directory域服务当前不可用"错误提示,对文件的打印造成了不必要的麻烦,遇到这个错误提示该如何处理呢?小编给 ...

  4. linux重定向文件容加时间,linux – 如何在Bash中将stdout重定向到文件时添加时间戳?...

    我有一个程序(服务器),我正在寻找一种方法(脚本),将所有的stdout重定向(或更好地复制)到文件并为每个条目添加时间戳. 我做了一些研究,我能得到的最远的是得益于How to add timest ...

  5. 【Word】Word运行时提示“Word在试图打开文件时遇到错误”的解决办法

    今天突然遇到下载的带有 .doc文件使用office 2013打开时这个问题:见下图 经多次查找资料,找到一种解决方法如下: 点击 文件 里面有个选项: 再点击 信任中心----信任中心设置 如下图: ...

  6. 【Jenkins】通过ANT构建JMeter任务时提示找不到jtl文件时的解决方法

    转载于:https://www.cnblogs.com/xiongjiawei/p/6547507.html

  7. c语言读文件时 fgetc,[求助]用fgetc()读取文件时遇到的问题~~

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 文件input.txt Today is sunday. Our beautiful pools had turned brownish          ...

  8. idea查看java文件编码_Intellij Idea编译项目下的.java文件时的编码问题

    由<编译.java文件时的编码问题>可知,在编译.java文件的时候,需要正确指定一个编码方案,该编码方案用于解码.java文件的字节流. 那么在使用Intellij Idea编译(假定使 ...

  9. Linux下创建硬链接,文件访问为空,提示:xxxx: 符号连接的层数过多

    Linux下创建软链接|硬链接,文件访问为空,提示:x x x: 符号连接的层数过多. 原因:创建符号链接的时候未使用绝对路径,无论是源文件路径还是目标路径,都需要使用绝对路径. 如: ln -s / ...

最新文章

  1. Logback中使用TurboFilter实现日志级别等内容的动态修改
  2. apache的防DDOS模块-mod_evasive
  3. 数据中台(一)数据资源规划与获取
  4. filezilla 设置filezilla使用明文密码_详解WordPress使用FTP上传主题和插件
  5. 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
  6. CF449B Jzzhu and Cities(Dijkstra)
  7. wordpress 根据文章ID获取分类ID和标签ID
  8. [Leedcode][JAVA][第460题][LFU]
  9. Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?
  10. 动与静--软件的雕塑艺术
  11. 【渝粤教育】电大中专消费者行为学_1作业 题库
  12. UVA12307 Smallest Enclosing Rectangle 题解
  13. Specular mode: Specular parameter 高光模式:高光参数 Standard Shader系列7
  14. mike21 matlab tools,MIKE21学习软件
  15. solaris linux 计算磁盘容量 cyl alt sec
  16. TSNAdb:肿瘤新抗原数据库
  17. 《宣龙教育》加密网课视频下载
  18. MSSQL 注入鄙见
  19. 从业多年数据分析师的亲身经验!
  20. 微信里的小程序怎么制作

热门文章

  1. 孟宁的Linux内核分析,Linux内核分析-MOOC小结
  2. Android 设置动态壁纸没有确认按钮处理方式
  3. 叉车轮胎的种类有哪些?
  4. (dll下载网站推荐)由于找不到msvcr120D.dll,程序无法执行的解决方案
  5. python for循环案例-Python利用for循环打印星号三角形的案例
  6. matlab写出函数表达式,matlab 由状态空间表达式求传递函数 笔记 | 学步园
  7. vivo 商城架构升级-SSR 实战篇
  8. 半导体激光器基础知识学习计划
  9. 郑州python培训机构排名
  10. OLEDB的Excel的IMEX和HDR是什么意思