Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面小编就给大家介绍下Linux下ldd命令的使用方法,感兴趣的朋友一起来学习下吧。
在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了。 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, 有的甚至需要熟练使用。
ldd 命令打印程序和库的共享库依赖项。注意:ldd 不是一个可执行程序,而只是一个 Shell 脚本。
如果您的工作涉及到Linux中的可执行文件和共享库的深入知识,则需要了解几种命令行工具。 其中之一是ldd,您可以使用它来访问共享对象依赖关系。 在本教程中,我们将使用一些易于理解的示例来讨论此实用程序的基础知识。
如果你的程序执行起来缺少某个库,我们就去下载,但是把库放到哪里才能让程序正确是识别出来呢?使用ldd就可以了!
1.在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行;
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:
本文仅做命令的表面解释,有关Linux动态库和静态库的其他知识还请参照文末参考文章。
背景:第三方so依赖glibc2.14版本,如何在不升级cenos 6.2自带的gblic2.12情况下,运行so?
某日开发说,一台测试用虚机可以PING通SSH不能连了。运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢?
ldd用来输出二进制可执行文件或者库文件的依赖;它本是一个script, 并不是binary 文件,其本质上只是设置了环境变量: D_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE(请参考ldd脚本文件的内容查看具体设置的环境变量)等。当通过export LD_TRACE_LOADED_OBJECTS=VALUE设置变量(该变量的值无所谓)后,那么无论执行任何的二进制可执行文件:都会显示该二进制文件对应的依赖;其效果和ldd 命令一样;
ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:
ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig。 ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
编程相关缩写 缩写 | 全称 | 说明 — | — | — cc | C Compiler | gcc | Gnu Compiler Collection | 作为一个软件集被你下载下来编译安装的时候 gcc | Gnu C Compiler | 作为一个软件被你调用来编译C程序的时候 g++ | Gnu c++ compiler | 其实g++只是调用gcc,然后连接c++的库,并且作相应的一些编译设置而已 gcj | Gnu Compiler for Java | gdb | Gnu DeBug |
Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。但对有经验的人来说,被构建进操作系统的大量共享代码对于编写新应用来说却是个优点。
前天一个研发的兄弟问我,实现完成了ClickHouse数据备份的功能,然后把数据上传到HDFS之类的文件系统中,但是提交给测试,发现程序把网卡带宽跑满了,就向我咨询在Linux下是否有可以限制某个命令操作的带宽速率的,然后就推荐了trickle这个命令给研发同学,这里我也推荐给大家。
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
Linux下使用inotify监控文件变化是一个好用的办法,如何配置inotify,网上有很多教程,这里就不说了。 问题发生在自己下载编译inotify后,运行时报错,找不到 libinotifytools.so.0 ,运行ldd命令结果如下:
学到了不少东西。知道了一个网站 http://kernelnewbies.org,一些FAQ , 摘录如下
问题:当你们调用一个特定的可执行文件在运行时载入了哪些共享库。是否有方法可以明确Linux上可执行程序或运行进程的共享库依赖关系? 查看可执行程序的共享库依赖关系 要找出某个特定可执行依赖的库,可
继《宋宝华:一个简单的python脚本看透Linux程序对库的依赖》之后,作为一个python的初级用户,学习和实践python的步伐根本就不下来!
在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
比如: build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release
本文记录于 2024.04.26 如果你阅读本文时间距离本文记录时间过远,可能本文记录的信息已失效
链接是代码生成可执行文件中一个非常重要的过程。我们在使用一些库函数时,有时候需要链接库,有时候又不需要,这是为什么呢?了解一些链接的基本过程,能够帮助我们在编译时解决一些疑难问题。比如,下面就有一种奇怪的现象。
Glibc 软件包包含主要的 C 语言库。它提供用于分配内存、检索目录、打开和关闭文件、读写文件、字符串处理、模式匹配、算术等用途的基本子程序。
ELF(Executable and Linkable Format)是一种可执行文件和可链接文件的标准格式,用于在Linux和Unix系统中存储程序和库文件。它是一种二进制文件格式,包含程序的代码、数据、符号表、段表等信息。
本文转载自助安社区(https://secself.com/),海量入门学习资料。
copylib.sh(类似ldd命令):用于将.so库文件的依赖项复制并放入自动生成的 “lib文件” 中。
大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB 、JavaScript。
Linux下动态库是通过mmap建立起内存和文件的映射关系。其定义如下void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);,在第一个参数start为NULL的时候系统会随机分配一个地址,我们可以通过示例来看mmap映射地址的流程。
环境: OEL 5.7 + Oracle 10g + amdu_X86-64 现象: 我的两套实验环境,一套单实例,一套RAC,操作系统都是OEL 5.7,数据库都是Oracle 10g,上传同样的amdu介质。一个正常,一个报错: --报错环境: [oracle@rac1-server lib]$ amdu amdu: symbol lookup error: amdu: undefined symbol: hac_kpuhh
环境: OEL 5.7 + Oracle 10g + amdu_X86-64 现象: 我的两套实验环境,一套单实例,一套RAC,操作系统都是OEL 5.7,数据库都是Oracle 10g,上传同样的amdu介质。一个正常,一个报错:
工作中需要自行编译一个Python二进制程序,并尽量减少该程序依赖的库文件,使之在相同CPU架构上有更良好的可移植性。先找了下网上的资料,都不太详尽,经过探索最终还是成功了,这里记录一下过程以备忘。
这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享库和可执行文件。为了解动态加载的内部工作方式进行了优化。写这篇文章是为了消除我在该主题上的知识欠缺,以便成为一名更好的程序员。我希望它也能帮助您变得更好。
平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源。本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker Hub 官方上的 Redis 镜像进行说明。
Linux软件简介 Linux上几乎所有的软件都经过了GPL授权,因此几乎所有的软件都会提供源码。 而一个软件要在Linux上执行,必须是二进制文件,因此当我们拿到软件源码后,需要将它编译成二进制文件才能在Linux上运行。 软件编译过程 将源码编译成可供Linux运行的二进制文件一共需要两步: 1. 使用gcc编译器将源码编译成目标文件 2. 再次使用gcc编译器将目标文件链接成二进制文件 这过程看似简单,实则不然。一个软件的源代码往往被封装在多个源文件中,此外这些文件有错综复杂的依赖关系,
明明依赖文件(an excutable binary)是存在的,但执行却无法找到文件;这篇文章就来记录一下这个问题的解决过程
TCP包装器是基于主机的访问控制系统。它们用于通过仅允许特定客户端访问服务器上运行的服务来防止对服务器的未授权访问。
在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。
我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护。我们可以把他们制作成相应的功能函数,使用时直接调用就会很方便,还可以进行后期的功能升级。
在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。
tcp_wrapper是一个工作在传输层、对于进出本机访问某特定服务的连接基于规则进行检查的一个访问控制工具,tcp wrapper只能对基于tcp协议的服务作访问控制,但并不是所有基于tcp协议的服务都能实现用tcp wraper作访问控制
领取专属 10元无门槛券
手把手带您无忧上云