环境变量
参考资料:(侵删)
##先了解一下LD_PRELOAD
LD_PRELOAD 是 Linux/Unix 系统的一个环境变量,它影响程序的运行时的链接(Runtime linker),==它允许在程序运行前定义优先加载的动态链接库。==这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,==我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。==
一般来说,程序的链接分为静态链接和动态链接,静态链接就是把所有所引用到的函数或变量全部地编译到可执行文件中。动态链接则不会把函数编译到可执行文件中,而是在程序运行时动态地载入函数库,也就是运行链接。所以,对于动态链接来说,必然需要一个动态链接库。动态链接库的好处在于,一旦动态库中的函数发生变化,对于可执行程序来说是透明的,可执行程序无需重新编译。这对于程序的发布、维护、更新起到了积极的作用。对于静态链接的程序来说,函数库中一个小小的改动需要整个程序的重新编译、发布,对于程序的维护产生了比较大的工作量。
在这里,我们细分一下程序的连接:
程序的链接可以分为以下三种
静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。
装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。
运行时动态链接:原程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。
==动态链接库的 搜索路径搜索的先后顺序==
编译目标代码时指定的动态库搜索路径(可指定多个搜索路径,按照先后顺序依次搜索);
* 环境变量 LD_LIBRARY_PATH 指定的动态库搜索路径(可指定多个搜索路径,按照先后顺序依次搜索);
* 配置文件 /etc/ld.so.conf 中指定的动态库搜索路径(可指定多个搜索路径,按照先后顺序依次搜索);
* 默认的动态库搜索路径 /lib;
* 默认的动态库搜索路径 /usr/lib;
总结:LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib > /usr/lib
零散的知识点
Linux规定动态链接库的文件名规则比如如下:
libname.so.x.y.z
lib:统一前缀。
so:统一后缀。
name:库名,如 libstdc++.so.6.0.21 的 name 就是 stdc++。
x: 主版本号 。表示库有重大升级,不同主版本号的库之间是不兼容的。如libstdc++.so.6.0.21 的主版本号是 6。
y: 次版本号 。表示库的增量升级,如增加一些新的接口。在主版本号相同的情况下, 高的次版本号向后兼容低的次版本号 。如 libstdc++.so.6.0.21 的次版本号是 0 。
z: 发布版本号 。表示库的优化、bugfix等。相同的主次版本号,不同的发布版本号的库之间 完全兼容 。如 libstdc++.so.6.0.21 的发布版本号是 21。
不过可以发现,这里我们要利用的环境变量 LD_PRELOAD 并没有出现在这里的搜索路径之中,反而出现了一个 LD_LIBRARY_PATH,这里关于二者之间的关系和区别在 stackoverflow 上也有大佬讨论,观点也很多,不过在这里我比较认可的是下面这个观点
LD_PRELOAD (not LD_PRELOAD_PATH) 是要在任何其他库之前加载的特定库 ( files ) 的列表,无论程序是否需要。LD_LIBRARY_PATH 是在加载无论如何都会加载的库时要搜索的 目录列表。 在 linux 上,您可以阅读 man ld.so 有关这些和其他影响动态链接器的环境变量的更多信息。
可见,这里 LD_PRELOAD 甚至超脱于动态链接库的搜索路径先后顺序之外,它可以指定在程序运行前优先加载的动态链接库
环境变量
参考文章:(侵删)
####什么是环境变量
环境变量是指在操作系统中用来指定操作系统运行的一些参数:也就是说,操作系统通过环境变量来找到运行时的一些资源。例如链接的时候帮助链接器找到动态库(标准库)或者是执行命令的时候,帮助用户找到命令的位置。
NewStart桌面操作系统中常用的环境变量有 PATH、HOME、LOGNAME等。
l PATH指定命令的搜索路径;
l HOME 指定的是当前用户主目录;
l LOGNAME指定的是当前用户的登录名;
提示:除了以上常见的环境变量,部分应用程序在安装时也需要增加环境变量才能生效,比如Java使用的环境变量:JAVA_HOME 和 CLASSPATH等。
title: 环境变量命令
date: 2023-06-11 23:32:02
tags: 靶场学习
环境变量命令
- env命令
显示所有的环境变量,执行env 命令。
- export命令
export 命令用于设置或显示环境变量,在shell 中执行程序时,提供一组环境变量。export 可以新增,修改或删除环境变量,作为后续执行的程序使用。
export [-fnp][变量名称]=[变量设置值]
命令选项:
- -f代表[变量名称]中为函数名称。
- -n删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
- -p列出所有的shell赋予程序的环境变量。
export 环境变量名称=$[环境变量名称]:[新添加的环境变量的内容]:
如果直接赋值,将直接修改变量
按 export 环境变量名称=$[环境变量名称]:[新添加的环境变量的内容] 将新值添加到末尾
path命令
path 决定了 shell 将到哪些目录中寻找命令或程序,path的值是一系列目录,当用户运行一个程序时,系统会在这些目录下进行搜寻编译链接。
PATH=$PATH:<PATH1>:<PATH2>:------:<PATHN>
可以用户添加指定的路径,中间用冒号隔开。
1.安装一个新的命令在 /usr/local/apache/bin 目录下。
2.通过修改.bashrc文件来设置环境变量,赋予某个用户权限使用此环境变量。
3.在终端界面,执行 vi 命令 在 .bashrc文件末尾加入
export PATH=$PATH:/usr/local/apache/bin 命令。
4.保存并退出文件,执行 source .bashrc 命令让其环境变量生效。
5.如果要让所有用户可用这个环境变量,则以上第2、3步的修改和生效文件由.bashrc改为/etc/profile。
提示:如果 环 境 变 量作 为 临 时 使用 , 还可 以 直 接 在终 端 界 面 上直 接 执 行 export PATH=$PATH:/usr/local/apache/bin 命令。