Linux共享库(一)

Linux进程间通信——so共享库的使用学习笔记 阅读详情

Linux中库文件有三种:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。(这和Windows的库机制基本上是一样的,Windows的DLL使用LoadLibrary和FreeLibrary来在程序运行时对共享库进行加载和卸载)。

库文件的命名:
库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。共享库的后缀名由.so和版本号组成,静态库的后缀名为.a。例如:
libname.so.major.minor
libname.a
这里的name可以是任何字符串,用来唯一标识某个库。

库文件的位置:
在/usr/lib和/lib目录中可以找到绝大多数的共享库。连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中,在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序也会对列出的这些目录进行搜索。在默认情况下,Linux将首先搜索指定库的共享版本,如果找不到,才会去搜索静态版本。

以下是制作共享库的例子。

制作共享库主要过程有两步:
1 生成 .o 文件。
gcc -c Upper.c -o Upper.o

2 将 .o 文件链接成库文件。
gcc -shared Upper.o -o libUpper.so

共享库的使用:
在文件UseUpper.c 使用了导出的函数UpperCase。
在测试该库时,可以使用环境变量LD_LIBRARY_PATH
用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/the path of libUpper.so
然后编译链接UseUpper.c
gcc -o UseUpper UseUpper.c -lUpper -L/the path of libUpper.so

+++++++++++++++++++++++

++++++++++++++++++++++

/* Upper.h  */
#ifdef DLL_CWGK_ZC
#define  EXPORT_SYMBOL extern
#else  
#define  EXPORT_SYMBOL
#endif

EXPORT_SYMBOL 
char *  UpperCase( char *  targetStr);

+++++++++++++++++++++++

 

/* UseUpper.c */
#include 
"Upper.h"
#include 
<stdio.h>
#include 
<string.h>

int  main()
{
    
char y[] = "adfbslek"
;
    printf(
"%s "
, UpperCase(y));
    
return 0
;
}

注:

1.Shared Libraries(挺好的文章)
http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

2."cannot restore segment prot after reloc: Permission denied"
http://bbs.chinaunix.net/thread-1088558-1-2.html

3. 2的解决办法,进一步可以学习一下SELinux
http://www.ittvis.com/services/techtip.asp?ttid=3092

4.Linux 共享库:尽量避免 LD_LIBRARY_PATH
http://jicknan.blogspot.com/2007/09/ldlibrarypath.html

LD_LIBRARY_PATH is not the answer -
http://prefetch.net/articles/linkers.badldlibrary.html

Why LD_LIBRARY_PATH is bad -
http://xahlee.org/UnixResource_dir/_/ldpath.html

LD_LIBRARY_PATH - just say no -
http://blogs.sun.com/rie/date/20040710

 

/* Upper.c */
#include 
< string .h >
#include 
< stdlib.h >
#define   DLL_CWGK_ZC
#include 
" Upper.h "

char *  UpperCase( char *  targetStr)
{
      
int LenStr; 
      
int Index;
      
int Tmp;

      
if (targetStr == NULL)
          
return NULL;

      LenStr 
= strlen(targetStr);
      Index 
= 0;
 
      
for(; Index < LenStr; Index++)
      
{
           
if(!isalpha((int)targetStr[Index]))
                
return NULL;
      }

 
      Index 
= 0;
      
for(; Index < LenStr; Index++)
    
{
           Tmp 
= targetStr[Index];
           targetStr[Index]
=(char)toupper(Tmp );

      }



      
return targetStr;
}


全网最全 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置 昨天(2024年7月23日)我们分享了学生及科研人员电脑配置推荐 | 笔记本+外置显卡配置,性能足够支持完成你博士论文文本内容,那么今天我们就分享一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置的教程,我们使用一文来解决大家在做生信时遇到安装系统、配置环境的问题。在此文中,我们尽快可能给出一套全网最全的教程。目标是解决新手小白同学查资源的困惑和难题。但是,每个童鞋遇到的问题不一样,此教程也不可能把你遇到的每个问题都归纳在其中。我们也希望, 阅读详情

相关推荐

将Apollo高精地图中的车道线叠加在多种导航地图上

本文介绍了将Apollo高精地图车道线叠加到普通导航地图的技术方案。高精地图具备厘米级车道精度和丰富的语义信息,叠加可实现可视化验证、调试分析和数据对比等功能。核心技术包括坐标系统转换(UTM/WGS84/BD09/GCJ02)和数据处理流程,通过Python脚本完成Apollo地图解析、坐标批量转换和多格式输出。文章详细提供了环境准备、工作目录创建和坐标转换脚本等操作步骤,实现了高精地图数据在OpenStreetMap、百度地图和高德地图上的可视化展示。

Hi20240217的博客 1304

计算几何实践1:基础

2017-11-27   计算几何在CAD开发,游戏开发中比较重要,可能只有机械和CAD方向的研究生才把这门课作为基础课程,很多做游戏的同学未必专门学习过这门课程。我觉得专门学习一下还是非常有必要的。我这两年多基本上在做CAD的开发,或多或少都需要涉及到这门课程里的知识。只是,一直没有系统的总结一下。我这两年虽然也做了很多的杂活儿,但是,主要还是在CAD组的工作。我个人对于CAD没有那么

know yourself 688

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling

今天在开实验室开双系统台式机时,ubuntu 20.04 系统下,突然在某次关机后再开机时,本来启动好好的,但是在进行图形化启动时,本来应该是显示输入账号和密码时,直接黑屏报错了,内容为 hdaudioC0D2: unable to configure disabling ,这里是记录了报错的解决全过程

qq_48717745的博客 973

Android积累之《Wrong orientation? No orientation specified, and the default is horizontal, yet this la:》

Wrong orientation? No orientation specified, and the default is horizontal, yet this layout has multiple children where at least one has layout_width="match_parent" 解决方法: 在android:text="就不"时上面老是报错那

zsb190623的专栏 9432

ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署

背景: 这周,心情来潮,想把Aries 开发框架和Taurus 开发框架给部署到Linux上,于是开始折腾了。 经过重重非人的坑,终于完成了任务: Aries on CentOS7:mvc.aries.cyqdata.com Taurus on CentOS7:mvc.taurus.cyqdata.com 不过在发布的过程中,发现有大堆共同的dll(100多个,20多M): ...

weixin_30613343的博客 240

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 439

linux静态库与共享库(一)

1 引言 软件设计中有一条原则是模块化,当一个项目达到一定规模时,往往将模块编译成库的形式,这也有利于分工协作。在linux中库分为静态库和动态库。静态库,是在可执行程序链接时就已经将该库的代码链入到可执行程序中,在物理上成为执行程序的一部分,使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时动态加载到执行程序中,可以被多个可执行程序

hmalloc的专栏 941

【三维重建】基于多视角图像的三维重建

基于多视角图像的三维重建》

m0_64446860的博客 8678

linux 共享库目录,linux共享库环境变量

今天在执行一个protobuf程序时,提示error while loading shared libraries: libprotobuf.so.8: cannot open shared object file: No such file or directory错误。google了一下,是由于找不到lib这个文件。解决办法:一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的...

weixin_42468240的博客 400

linux共享库的查找

在linux下运行应用程序,经常需要用到一些共享库文件,如libxx.so等。        而在linux下共享库的查询/加载是通过文件/lib/ld.so 实现的,ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?         1.Linux 通用的做法是将非标准路经加入 /e

lxl584685501的专栏 965

【异常】Cursor 编辑器 “Too many computers“ 报错排查与完整解决方案

该报错通常在启动Cursor、调用AI对话/代码补全核心功能时触发,会直接阻断编辑器AI能力的正常使用。

奶爸的编程之路,也就一周冷个三天 390

cannot open shared object file: No such file or directory解决方法

在Linux下执行某些外部程序的时候可能会提示找不到共享库的解决方法

ZONGXP的博客 9万+

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1245

调用共享库问题的解决记录

调用共享库问题的解决1 问题前身2 问题发现3 问题解决3.1 分析原因3.2 解决办法方法1方法23.3 具体操作4 结果PS: 2020/3/16 1 问题前身 上次,我在Linux的QT下面实现了共享库的创建以及调用,不知道的如何创建和调用共享库的可以 参考这里. 但是,出现了点问题,具体是,我在QT Creator界面下直接点击编译运行能够运行,但是在编译过程中创建的文件下,点击文件下的可...

qq_40263915的博客 341

共享库的初始化和~初始化函数分析 - absurd的专栏 - CSDNBlog

导读: 共享库的初始化和~初始化函数分析 转载时请注明出处:http://blog.csdn.net/absurd/ Win32下可以通过DllMain来初始化和~初始化动态库,而Linux下则没有与之完全对应的函数,但可以通过一些方法模拟它的部分功能。有人会说,很简单,实现_init/_fini两个函数就行了。好,我们来看看事实是不是这样的。 很多资料上都说可以利用_ini

xu的blog 1304

ethernet eth0: Could not attach to PHY

整个流程看下来就是MAC connect PHY的过程失败了,失败的具体原因根据config_init,上图(bcm54xx_config_init) ,从此方向入手去定位原因;我这里的问题是has_gmac4没有置1,根据 has_gmac4: uses GMAC4 core.按照上面的调用逻辑,添加了部分打印,定位到__phy_read接口返回失败。stmmac_mdio_read 大部分都是linux的标准接口。最终取决于平台用的是哪家的phy,调用config_init。

无线互联&网络介绍 2663

Linux 进程热升级

http://www.ibm.com/developerworks/cn/linux/l-cn-prcss-hotupgrd/ 为了实现 Linux 系统进程热升级,本文提供了一种底层的实现方法,即在不重启进程的条件下,升级进程的共享库模块。 背景 用户总是希望服务进程能保持稳定。如果可以 7*24 小时的工作,那就永远不要重启它。但是,软件产品的功能总是在不断的丰富。当用户发现一些新的功能正是他所需要的,他也许会主动要求进行一次升级。而当严重的安全问题出现时,用户就不得不接受强制的升级了。 .

~~ LINUX ~~ 1388

safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案

本文主要介绍了safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 Windows 2.2 Linux

weixin_43178406的博客 15万+

使用LD_Preload的Linux权限升级技巧

0x00 前言 共享库是程序在启动时加载的库。正确安装共享库后,之后启动的所有程序将自动使用新的共享库。 0x01 共享库名称 每个共享库都有一个名为soname的特殊名称。soname有前缀lib,库的后缀名为.so,后跟句号和版本号。 动态链接器可以通过运行一些动态链接的程序或共享对象来间接运行。程序ld.so和ld linux.so*查找并加载程序所需的共享对象(共享库),准备...

weixin_30586085的博客 1117

共享库的初始化和~初始化函数分析

共享库的初始化和~初始化函数分析 转载时请注明出处:http://blog.csdn.net/absurd/ Win32下可以通过DllMain来初始化和~初始化动态库,而Linux下则没有与之完全对应的函数,但可以通过一些方法模拟它的部分功能。有人会说,很简单,实现_init/_fini两个函数就行了。好,我们来看看事实是不是这样的。 很多资料上都说可以利用_init/_

国产开源 GUI 引擎 AWTK 6838

modbus poll Slave key.txt

modbus poll Slave key.txt

error while loading shared libraries: libtest.so: cannot open shared object file: No such file or di

error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: l...

buknow的博客 4896

UL 1642-2020 锂电池安规.pdf

UL 1642-2020 锂电池安规.pdf

添加共享库文件.so

在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so 实现的。 ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。一种方法是向这两个路径下加入你的.so。另一种是在别的目录下添加。 1)第一种方法,直接把你的.so加入到/lib或/usr/lib,完了以后调一下sudo /sbin/ldconfig生成 /etc/ld.so....

weixin_33725272的博客 249

聊一聊 Linux 上对函数进行 hook 的两种方式

这里给大家总结的两种注入方式,LD_PRELOAD 虽然简单,但粒度粗,适合简单的无侵入场景,如果希望更细粒度,建议使用活跃的 funchook 吧,虽然是一个岛国大佬实现的。

一线码农的专栏 794

STM32F103通过SPI接口与MAX31865模块实现测温功能_温度

MAX31865模块主要使用SPI接口与单片机进行通信,本次例程使用TPYBoard STM32F103RBT6 最小系统板和MAX31865模块进行通信。工程主要组成说明:docs/ -- MAX31865模块LIB库的使用说明image/ -- MAX31865模块实物图及连接指示图project/ -- MAX31865模块的Keil示例工程源码

linux安全源码,从源码分析:Linux共享库安全风险剖析 之 运行时加载顺序风险

一:概述在Linux开发过程中,我们会遇到这样的情况,明明可执行程序elf与共享库so在同一个目录,但是进入此目录执行./elf 却会提示so找不到?这种情况对于从Windows平台过渡过来的程序员是比较费解的。这里其实就涉及到Linux上可执行程序搜索需要的库的一个范围和顺序问题。首先,是范围问题,我们可以通过查询ld的说明文档知晓范围。其次,是顺序问题,如果第三方程序制作了一个与系统库同名的s...

weixin_30093159的博客 355

ISO 11146-2-2021.pdf

ISO 11146-2-2021.pdfLasers and laser-related equipment —Test methods for laser beamwidths, divergence angles and beampropagation ratios —Part 2:General astigmatic beams

error while loading shared libraries解决办法

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: error while loading shared libraries XXX 原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可。 一般这时候只需要apt-get install libxxx-dev或者下载

xiangxianghehe的博客 3万+
上一篇: VC下利用Pro*C开发Oracle接口(链接)
下一篇: COM笔记-组件的创建和类厂
cwgk_zc
博客等级 码龄20年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值