GNU/Linux下库机制笔记

GNU/Linux awk命令用法详解 本来计划年前写完的,结果现在才搞定,手册的内容一边翻一边实验,还有awk版本问题,又参考Effective AWK Programming对语法和示例做了些补充。终于写完了,大家元宵节快乐!AWK简介AWK是一门解释型的编程语言,它的名字来源于它的三位作者的姓氏:Alfred Aho,Peter Weinberger和Brian Kernighan。AWK能够应用于广泛的计算和数据处理任务。所有的... 阅读详情

作者: comcat 发表日期: 2006-09-08 10:44                http://comcat.blog.openrays.org/blog.php?do=showone&tid=69

1. 创建静态库:
gcc -c hello.c -o hello.o
ar rcs libhello.a hello.o

2. 使用静态库:
gcc -o test test.c -static -L. -lhello


3. 共享库版本: version.minor.release


4. 构建动态共享库:

gcc/g++下加 -fPIC -shared 参数即可

其中 -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
可以export LD_DEBUG=files,查看每次加载共享库的实际地址。

其中 -shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描述
信息,去除共享库所不需的信息。

可以分解为如下步骤:

I. gcc -c err.c -fPIC -o err.o
II. gcc -shared -o liberr.so.0.0 err.o

II <==> ld -Bshareable -o liberr.so.0.0 err.o

III. ln -s liberr.so.0.0 liberr.so



5. 动态共享库的使用:

a. 由共享库加载器自动加载

gcc -o test test.c -lerr -L. -Wl,-rpath=./

-Wl,option
Pass option as an option to the linker. If option contains commas,
it is split into multiple options at the commas.

-rpath: 指定运行时搜索动态库的路径,可以用环境变量LD_LIBRARY_PATH指定。


b. 程序自己控制加载、符号解析(使用libc6之dl库)

gcc cos.c -o cos -ldl

/* cos.c */
#include <stdio.h>
#include <dlfcn.h>

int main()
{
void *handle;
double (*cosine)(double);
char *error;
double rev;

handle = dlopen("libm.so", RTLD_LAZY); // 加载动态库
if(!handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}

dlerror();

cosine = dlsym(handle, "cos"); // 解析符号cos
if((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}

rev = cosine(3.1415926); // 使用cos函数
printf("The cos result is: %f\n", rev);

dlclose(handle);

return 0;
}




6. GNU/Linux下动态库之加载器为/lib/ld-linux.so, 可执行的。

/lib/ld-linux.so ./cos <===> ./cos


7. 有用的环境变量

LD_LIBRARY_PATH

指定运行时动态库的搜索路径

LD_DEBUG

调试用,其值可为:

libs display library search paths
reloc display relocation processing
files display progress for input file
symbols display symbol table processing
bindings display information about symbol binding
versions display version dependencies
all all previous options combined
statistics display relocation statistics
unused determined unused DSOs
help display this help message and exit


8. 搜索含有cos函数的共享库名

nm -AD /lib/* /usr/lib/* 2>/dev/null | grep "cos$"

nm -- 从对象文件中列出符号。


9. 读取ELF文件格式信息

readelf -Ds ./libfoo.so #读出共享库的符号

Linux 内核及 GNU/Linux 操作系统的基本体系结构 1. Linux 内核简介 内核:在计算机科学中是一个用来管理软件发出的数据 I/O(输入与输出)要求的计算机程序,将这些要求转 译为数据处理的指令并交由中央处理器(CPU)及计算机中其他电子组件进行处理,是现代操作系统中最基本 的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定 一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件 抽象的方法,来完成这些操作。通过进程间通信机制及系统调用,应用进程可间接控制所... 阅读详情

相关推荐

掌握GNU/Linux应用编程与构建工具

本文将深入探讨GNU/Linux系统下应用编程与构建包的过程,包括静态库、共享库与动态加载库的创建与使用,以及如何使用GNU Autotools自动化构建过程。通过实例项目分析,读者将了解到使用automake和autoconf工具简化大型项目构建的策略,包括创建和配置Makefiles、管理依赖关系和多平台构建环境。

weixin_29009401的博客 294

gnutls库

GNU TLS,是GNU的SSL实现,或者按GNU的意思是SSL的升级换代 转载于:https://www.cnblogs.com/lonelybyte/archive/2010/03/13/1684930.html

weixin_30908103的博客 464

GNU/Linux真相:为什么ls不是Linux写的

操作系统本质上是内核与用户空间工具链的协同体。Linux仅提供进程调度、内存管理、系统调用等底层能力,而命令行交互、文件操作、编译构建等日常功能,均由GNU项目提供的核心工具(如ls、bash、gcc、glibc)实现。这种组合并非简单拼接,而是由GPL许可证强制保障的协议级耦合——静态链接GPL库即触发源码公开义务,动态依赖glibc则构成事实标准。技术上,ls等命令通过libc封装系统调用,完全解耦于内核版本,仅依赖稳定的syscall ABI,从而支撑跨内核兼容与发行版多样性。理解GNU/Linux的

weixin_30402231的博客 257

Linux动态库的工作原理详解

Linux动态库的工作原理详解 转自:http://www.fenesky.com/blog/2014/03/17/how-shared-library-works.html 关于动态库的原理和加载过程,网上也有很多版本,但是基本都在讲解动态库的编译以及使用,很少能够有文章对动态库的加载以及工作原理进行深入的剖析和讲解。说来也很惭愧,在过去的工作中,没能彻底的去弄清楚动态库的工作原理。直到

hudaliquan的专栏 1万+

深入理解GNU/Linux编程与脚本开发

本文探讨了GNU/Linux系统下的编程与脚本开发,涵盖了从基础命令到高级脚本语言的应用。包括标准命令的使用、Bash编程、sed与awk文本处理工具、flex与bison解析器生成器、以及Ruby与Python脚本语言的介绍。这些内容不仅为开发者提供了强大的工具和语言来处理Linux下的软件开发任务,还为原型设计、文本处理和系统管理提供了高效的解决方案。

weixin_42601134的博客 700

深入探讨GNU/Linux开发工具与技术

本文深入探讨了GNU/Linux系统中的源代码控制、数据可视化、文件处理、管道编程、套接字编程等开发技术。通过对各个章节内容的详细解析,为读者提供了丰富的技术细节和实用案例,旨在帮助读者在GNU/Linux环境下更高效地开发应用程序。

weixin_33812391的博客 437

GNU/Linux C 库I/O缓冲机制

0.引子 对于使用C语言开发者着而言,I/O库可能是最为经常的使用的程序库,当你需要调试的时候可能最为经常使用的就是printf打印了。可是不知道大家,是不是遇到过这样一个问题,那就是我明明打印了,为什么终端里没有输出呢?为什么日志没有存到文件里?我也遇到过这样的问题,当时也没有搞清楚问题的原因。今天,在读UNIX高级环境编程的fork一节时,意外的收获了对于该问题最终的解释,一切的原因都是因为...

飞翔de刺猬 927

深入GNU/Linux进程与线程管理

本文深入探讨了GNU/Linux系统中进程和线程的管理技术,涵盖了进程间通信、进程控制命令以及线程的创建和同步等方面。通过介绍kill命令、/proc文件系统和POSIX线程库的使用,展示了Linux下进行有效编程的方法和技巧。

weixin_36311421的博客 298

Debian GNU/Linux的新手入门介绍

Debian GNU/Linux的新手入门介绍

qq_59334230的博客 1508

kaggle注册以及数据集下载全流程

kaggle注册,数据集下载及常见问题

Arriteey的博客 2万+

基于freesurfer和3Dslicer的脑区分割与电极定位全流程解析(实战指南)

本文提供了一套基于FreeSurfer和3D Slicer的颅内电极定位实战指南。详细解析了从环境搭建、数据预处理、FreeSurfer脑区分割、影像配准,到3D Slicer中手动与自动化电极定位的全流程。重点介绍了如何利用FreeSurfer进行高精度脑区分割,并在3D Slicer中实现电极触点的可视化标记与坐标提取,最终获得带脑区信息的电极数据,为iEEG/SEEG研究奠定基础。

banana的博客 299

5分钟搞懂GNU C库:构建Linux系统的核心基石

GNU C库(glibc)是每个Linux系统不可或缺的基础组件,它为应用程序提供了与操作系统内核交互的关键接口。无论是简单的"Hello World"程序还是复杂的服务器应用,都依赖glibc实现内存管理、文件操作、网络通信等核心功能。作为开源世界最广泛使用的C标准库,glibc的稳定性和性能直接影响着整个系统的可靠性。 ## 为什么glibc对Linux如此重要? glibc就像应用程序与

gitblog_00058的博客 660

eNSP-Pro配置又丢了?手把手教你用导出功能防患于未然

本文详细介绍了eNSP-Pro配置防丢失的全套方案,包括运行时内存、虚拟存储设备和宿主机文件系统的配置存储机制,以及多维度备份策略和特殊场景下的恢复技巧。通过优化保存流程、自动化定时导出和版本化管理,帮助网络工程师有效防止配置丢失,提升工作效率。

weixin_42665725的博客 242

优化GNU/Linux桌面安装的九个步骤

配置GNU/Linux的工作不是说安装光盘弹出来后,甚至不是说安装后向导运行后就算完成了。虽说安装后你面对的是个基本系统,却不是你的所有偏好和需求都已经考虑在内的优化后系统。考虑到操作系统的大小和复杂性,别指望系统安装后就让你称心如意--在Windows上完成安装后基本上也是这种情形。 要是你对GNU/Linux有所了解,也许知道你不需要碎片整理工具,也不需要为反病毒软件过于操心。但是你还需要做

Chili min的专栏 1348

ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。 发送端系统配置 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端, D01CLNT200为接收端 2,将逻辑系统分配给对应的client 3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例 4,进入tcode-WE30,创建Idoc Ty...

Nathan的博客 4077

深入解析ChangeFormer:基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer这一基于Transformer的孪生网络在遥感变化检测中的创新应用。通过分层Transformer编码器、特征差异计算模块和轻量级MLP解码器的设计,ChangeFormer在LEVIR-CD数据集上取得了90.4%的F1分数,显著优于传统卷积网络。文章还详细探讨了工程化实现、训练调参和模型部署的优化策略,为遥感变化检测领域提供了新的技术范式。

weixin_29051811的博客 731

GNU/Linux编程指南.pdf——开启Linux编程之旅的钥匙

GNU/Linux编程指南.pdf——开启Linux编程之旅的钥匙 【下载地址】GNULinux编程指南.pdf简介 这是一部全面深入的GNU/Linux编程教程,涵盖从基础到高级的编程知识与技巧。内容涉及Linux环境下的编程工具、库函数、系统调用、内核解析,以及网络编程、图形界面编程等多个领域。书中包含大量实用实例,...

gitblog_06730的博客 873

步进电机 cia402协议 报文自己的理解 (笔记)

步进电机 cia402协议 报文自己的理解 (笔记)

she666666的博客 3805

HoRain云--揭秘GNU/Linux核心架构:从底层到应用

摘要: 本文系统解析了GNU/Linux的核心架构与组件,涵盖硬件抽象层、内核模块(进程调度、内存管理等)、用户空间工具链(GNU核心命令、systemd)及文件系统标准(FHS)。深入探讨了Shell环境、软件包管理(APT/RPM)、系统初始化流程(SysVinit vs Systemd)及高级机制(IPC、SELinux安全)。结合典型场景(服务器运维、容器化部署)和学习路径(内核编译、源码调试),提供实践指导。旨在帮助开发者精准排障、优化性能并构建定制化系统,适合从入门到进阶的Linux学习者。

2401_86544677的博客 978

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

面试真题集(十六):TensorRT基础

TensorRT面试真题解析:从模型优化到推理部署 本文精选了14道TensorRT面试题,涵盖选择题、简答题和场景题,深度考察推理工程师对TensorRT核心技术的理解。内容聚焦三个关键维度: 基础概念 FP16推理中Softmax层为何需保持FP32(数值稳定性) INT8校准原理(EntropyCalibrator2的鲁棒性优势) Plugin V3接口的构建/运行分离设计 性能优化 Conv-BN-ReLU融合减少40-60%延迟的关键机制(访存优化) 动态Shape配置策略(min/opt/max

PeterPan的博客 71

探秘GNU/Linux Shell:命令行的魔法世界

探秘GNU/Linux Shell:命令行的魔法世界

一起coding,一起嗨。 873

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Ubuntu /usr/include/x86_64-linux-gnu目录的作用浅谈

在 Ubuntu 系统中,目录是,主要用于为编译器(如 GCC、Clang)提供针对该架构的预编译头文件和库接口定义。

jongden的专栏 1016

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

为什么 Windows 系统盘严重膨胀,而 GNU/Linux 要好得多?

为什么 Windows 系统盘严重膨胀,而 GNU/Linux 要好得多?

2409_89014517的博客 559

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 龙芯汇编语言编程艺术
下一篇: C 语言中位操作技巧
LonlyGod
博客等级 码龄15年 32粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值