程序的动态链接(5):使用动态库

news2025/2/2 18:41:47

前言

Linux下动态库文件的命名规范是以lib开头,紧接着是动态库名,以.so为后缀名,即lib + 动态库名+.so

动态库查找过程

在Linux下,动态库的搜索的优先级顺序为:

  • 编译目标代码时指定的动态库搜索路径,保存在.dynamic段中,由DT_NEED类型的项表示;
  • 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  • 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  • 默认的动态库搜索路径/lib/usr/lib

使用ldconfig机制

ldconfig是一个动态链接库管理命令,其目的为了让动态链接库为系统所共享。ldconfig默认的主要功能是在/lilb/usr/lib以及配置文件/etc/ld.so.conf内所指定的路径下,搜索可用的动态链接库文件(库文件的格式为:lib***.so.**),并创建缓存文件供动态链接程序(ld.so)使用。缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。 ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

环境变量

LD_LIBRARY_PATH

程序运行时,可以使用LD_LIBRARY_PATH环境变量临时指定程序所需引用的动态库的所在路径。

shell # LD_LIBRARY_PATH=/root/Workspace/CCode/test_dynamic_link ./main
Result: 15.

LD_PRELOAD

LD_PRELOAD可以指定程序预先需要装载的一些动态库。在LD_PRELOAD中配置的动态库会优先于正常规则指定搜索的动态库进行加载,并且无论程序是否依赖这些库,都会进行装载。由于全局符号介入机制的存在,LD_PRELOAD里面指定的动态库的全局符号会覆盖后面加载的同名全局符号,基于这点,我们可以很容易替换标准C库提供的函数接口,从而自定义库函数实现。

LD_DEBUG

LD_DEBUG用于打开动态链接器的调试功能,在设置这个变量时,动态链接器会在运行时打印出指定的信息。LD_DEBUG支持设置的值如下所示:

  • files:打印整个装载过程中,程序依赖的动态库、装载步骤以及装载地址等信息;
  • bindings:显示动态链接的符号绑定过程;
  • libs:显示动态库的查找过程;
  • versions:显示符号的版本依赖关系;
  • reloc:显示重定位过程;
  • symbols:显示符号表查找过程;
  • statistics:显示动态链接过程中的各种统计信息;
  • all:显示以上所有信息;
  • help:显示上面的各种可选值的帮助信息。

动态库的创建与使用

为了对动态库有个更直观的认识,这里使用下面的代码说明在Linux平台下如何创建和使用动态库库:
在这里插入图片描述
使用gcc将addvec.cmulvec.c编译成一个动态共享库文件,操作如下:
在这里插入图片描述
其中:

  • -shared选项:指定链接器创建一个动态共享库文件;
  • -fPIC选项:指定编译器生成位置无关的代码。

链接动态库

为了使用生成的动态库,我们在代码里调用libvector.so提供的外部接口:

#include <stdio.h>
#include "vector.h"

int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];

int main()
{
    addvec(x, y, z, 2);

    printf("z = [%d %d]\n", z[0], z[1]);

    return 0;
}

可以使用gcc编译main.c并指定链接libvector.so文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PLl24DsQ-1671463270048)(media/15572453242275/%E6%88%AA%E5%B1%8F2020-08-01%20%E4%B8%8A%E5%8D%8810.31.07.png)]
其中:

  • -L选项:指定动态库的路径;
  • -l选项:指定需要链接的动态库名。

相关参考

  • 《程序员的自我修养—链接、装载与库》
  • 《Linux二进制分析》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库(DM8)常用SQL学习

达梦产品手册 1.检查数据库版本及服务状态 1.1 查看达梦数据库运行状态 SELECT status$ as 状态 FROM v$instance;1.2 查看达梦数据库版本 SELECT banner as 版本信息 FROM v$version;2.创建用户并授权 2.1 创建用户 -- 使用 CREATE USER 语句创建 DM 用户&#xff0c;登…

Python爬虫详解

从今天开始&#xff0c;给大家介绍Python爬虫相关知识&#xff0c;今天主要内容是爬虫的基础理论知识。 一、爬虫简介 爬虫是指通过编写程序&#xff0c;来模拟浏览器访问Web网页&#xff0c;然后通过一定的策略&#xff0c;爬取指定内容。因此&#xff0c;爬虫的编写通常分为…

Nature Communications:人类丘脑的基因结构及其与十种常见大脑疾病的重叠

丘脑是位于大脑中心的重要交流中枢&#xff0c;由不同的核组成&#xff0c;对意识和高级皮层功能至关重要。丘脑结构和功能的改变涉及到常见的大脑疾病的发病机制&#xff0c;但丘脑的遗传结构仍然很大程度上未知。在这里&#xff0c;使用来自30114个个体的大脑扫描和基因型数据…

【Linux】进程创建、进程终止、进程等待

目录 一、进程创建 1.1 深入 fork 函数 1.2 写时拷贝 二、进程终止 2.1 进程退出码 2.2 exit 与 _exit 三、进程等待 3.1 进程等待必要性 3.2 进程等待 3.2 wait 与 waitpid 3.3 获取子进程 status 3.4 非阻塞等待 一、进程创建 1.1 深入 fork 函数 在 Linux 中…

如何对图片进行旋转?这些工具能将图片进行旋转

大家平时在日常生活中有没有遇到这种情况&#xff1a;从网上保存下来的图片发现角度方向是错误的&#xff0c;或者是从相机导入拍摄的图片&#xff0c;打开图片发现它们的方向不统一&#xff0c;不方便我们进行观看。这时需要我们对图片进行旋转操作&#xff0c;才能将图片摆正…

图表控件LightningChart.NET 系列教程(四):安装

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

Linux 内核网络栈分析: 接收数据

引言 对于内核网络栈的分析我在大二听了李勇大神来小组的讲座以后就想干了&#xff0c;但像很多主题的文章一样&#xff0c;始终没有勇气&#xff0c;也没有时间动手&#xff0c;我终究还是把这个话题从大二延到大三&#xff0c;从大三延到大四了。冥冥之中某种东西好像早已是…

Python 帮同事用pandas快速筛选Excel文件

同事正在为怎样处理一个18万行的全年财务Excel文件发愁&#xff0c;文件足足有30M&#xff0c;打开文件也要两三分钟&#xff0c;于是他就向我求助。大概意思就是要筛选出Data工作簿“源数据”Sheet中所有收款人对应的付款人及付款笔数、金额小计&#xff0c;于是我简化做了一个…

【RuoYi-Vue-Plus】学习笔记 45 - Spring 事件监听器 @EventListener 注解简单分析

文章目录前言参考目录测试方法配置说明测试方法功能调用流程分析事件监听器初始化事件发布流程前言 因为之前比较忙所以匿了一段时间&#xff0c;顺便当了神雕大侠&#xff08;“阳过”&#xff09;。前段时间框架已经发布了新版本 V4.4.0&#xff0c;而在最新的 dev 分支中使…

labelImg数据标注及yolov5的训练和测试

labelImg数据标注及yolov5的训练和测试 一、labelImg数据标注的使用 数据标注主要针对于哪个地方是什么&#xff0c;一般像隐私类的是不能标注的&#xff0c;如鲁迅的故居可以标&#xff0c;但是张三的住所就不能进行标注。 labelImg是数据标注主要使用的工具。 1、首先使用…

第十四章 概率图模型

14.1 隐马尔可夫模型 机器学习最重要的任务&#xff0c;是根据一些已观察到的证据&#xff08;例如训练样本&#xff09;来对感兴趣的未知变量&#xff08;例如类别标记&#xff09;进行估计和推测。概念模型提供了一种描述框架&#xff0c;将学习任务归结于计算变量的概率分布…

ffmpeg-AVPacket

目录 引子 翻译一下官方注释&#xff1a; 成员变量&#xff1a; AVBufferRef *buf pts dts data size stream_index flag side_data side_data_elems duration pos opaque opaque_ref time_base 引子 AVPacket是ffmpeg基础且非常重要的数据结构…

我国脐橙行业现状:种植面积、产量及市场规模不断增长 江西赣州是最大生产区

根据观研报告网发布的《2022年中国脐橙市场分析报告-市场全景评估与发展定位研究》显示&#xff0c;脐橙是芸香科&#xff0c;属柑橘亚科&#xff0c;是柑橘属植物甜橙的一类栽培品种&#xff0c;果皮难或稍易剥离&#xff0c;瓢囊9-12瓣&#xff0c;果心实或半充实&#xff0c…

ChatGPT

ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。目前&#xff0c;有部分地区&#xff08;例如中国大陆、香港&#xff09;无法使用此项服务&#xff0c;这里我就介绍一下中…

代码随想录训练营第55天|LeetCode 583. 两个字符串的删除操作、72. 编辑距离

参考 代码随想录 题目一&#xff1a;LeetCode 583. 两个字符串的删除操作 确定dp数组下标及其含义 为了方便dp数组的初始化&#xff0c;在整个分析问题的过程中在word1和word2的最前面添加空字符&#xff0c;注意&#xff0c;不是真正的添加&#xff0c;只是这么认为。 dp[i]…

大学英语笔记

words in use unit 1 The mayor condenseIt was reported exceedresearchers put deficittoo much————exposuremoving forward managerialthe lawyer adequateto help the competentmost parents&#xff0c;&#xff0c;&#xff0c;adjustingyou can count preciselyin …

工控CTF之协议分析8——特殊隧道

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

Python爬虫学习

文章目录前言概述简单爬虫requests模块⼊⻔数据解析re解析re模块总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 学习参考网站 概述 安全 爬⾍在法律上是不被禁⽌的 像王欣说过,技术是⽆罪的. 主要看你⽤它来⼲嘛 robots.tx…

经纬恒润以太网开发及测试方案,助力智能汽车落地

近年来&#xff0c;为了满足智能网联汽车的开发要求&#xff0c;车载以太网技术开始逐渐进入人们的视野。车载以太网可以满足带宽密集型应用如高级驾驶辅助系统&#xff08;ADAS&#xff09;、车载诊断系统&#xff08;OBD&#xff09;以及车载信息娱乐系统等所需的更高数据传输…

controlsfx框架NotificationPane组件的使用

controlsfx 是javaFx开源UI框架&#xff0c;里面有很多默认组件的补充&#xff0c;最近在使用其中的NotificationPane组件时&#xff0c;遇到一些问题&#xff0c;记录下来。 官方demo链接&#xff1a; https://github.com/controlsfx/controlsfx/blob/jdk-8/controlsfx-samp…