Linux动态链接库


发布于 2024-09-13 / 14 阅读 / 0 评论 /
Linux操作系统中,动态库的访问

1.LD_LIBRARY_PATH环境变量

LD_LIBRARY_PATH 是Unix 和 Linux 系统中的一个环境变量,完整含义是 "Loader Library Path" 或者说是 "Dynamic Linker Library Path",它提供了一个机制,允许用户指定除了系统默认搜索路径之外的其他目录,作为动态链接器搜索共享库的附加位置。

如果遇到“cannot open shared object file: No such file or directory”类型的错误,说明动态库文件找不到,首先确定动态库文件是否存在,然后确定是否在LD_LIBRARY_PATH变量指定的目录中。

2.Python读取动态库文件

有些Python程序在执行时需要加载动态库文件,可通过以下代码来检查是否能正常加载动态库文件。

python
from ctypes import *
libc = cdll.LoadLibrary("libc.so.6")
print(libc.time(None))

以上是加载libc.so.6库文件的案例。

3.ldd命令

ldd命令可以查看一个二进制文件或动态链接库的依赖关系。

4.查看libc这个库正在被哪些进程链接

可通过以下脚本来检测

#!/bin/bash

# 获取系统上所有正在运行的进程的PID
pids=$(ps -e -o pid=)

# 循环遍历每个PID
for pid in $pids; do
    # 使用/proc/<PID>/maps获取PID对应进程的内存映射
    maps_file="/proc/$pid/maps"

    # 检查maps文件是否存在
    if [ -f "$maps_file" ]; then
        # 使用grep查找是否链接了libc库,可替换对应的库文件名
        grep -q "libc\.so\.6" "$maps_file"

        # 检查上一步的返回状态, 如果返回状态为0,说明该进程链接了libc库
        if [ $? -eq 0 ]; then
            # 获取进程的可执行文件路径
            exe_path=$(readlink -f "/proc/$pid/exe")
            
            echo "Process PID: $pid"
            echo "Executable Path: $exe_path"
            echo "--------------------------------------------------"
        fi
    fi
done

注意使用root用户执行,因为/proc/目录需要root用户访问。