ldd arm-linux

本文介绍如何使用arm-linux-readelf及arm-uclibc-ldd工具检查ARM Linux平台下可执行文件的共享库依赖情况。通过具体命令展示,帮助读者理解如何定位和解决ELF文件的依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.arm-linux-readelf -a hello | grep "Shared library",结果如下:
0x00000001 (NEEDED) Shared library: [libc.so.6]
如果装了uclibc可以用arm-uclibc-ldd:
[root@localhost temp]# arm-uclibc-ldd hello
libc.so.6 => /lib/libc.so.6
ld-linux.so.2 => /lib/ld-linux.so.2
/lib/ld-linux.so.2 => /lib/ld-linux.so.2

<think>我们正在为交叉编译环境解决libdrm版本问题。用户使用arm-linux-gnueabi工具链,意味着目标平台是ARM架构的嵌入式Linux系统。之前给出的解决方案是针对x86_64主机的,现在需要调整为交叉编译。核心步骤:1.获取libdrm源码并交叉编译安装到指定目录(比如$SYSROOT)2.确保编译Mesa时能够找到交叉编译的libdrm具体步骤:步骤1:设置交叉编译环境变量假设用户已经配置好了arm-linux-gnueabi工具链,我们可以设置以下环境变量(具体路径根据用户工具链安装位置调整):exportCC=arm-linux-gnueabi-gccexportCXX=arm-linux-gnueabi-g++exportAR=arm-linux-gnueabi-arexportRANLIB=arm-linux-gnueabi-ranlibexportPKG_CONFIG_PATH=/path/to/your/sysroot/usr/lib/pkgconfig#重要:指定交叉编译的pkg-config路径,确保它指向sysroot中的.pc文件注意:用户需要有一个ARM平台的sysroot(包含头文件和库的目录)步骤2:交叉编译libdrm下载libdrm源码,并交叉编译安装到sysroot中。示例命令:wgethttps://dri.freedesktop.org/libdrm/libdrm-2.4.75.tar.gz#确保版本>=2.4.75tar-xzvflibdrm-2.4.75.tar.gzcdlibdrm-2.4.75./configure--host=arm-linux-gnueabi--prefix=/path/to/sysroot/usr#这里指定安装到sysroot的/usr目录下makemakeinstall注意:如果用户使用的是meson构建系统,则需要用meson交叉编译,但考虑到嵌入式环境可能更习惯autotools,这里使用autotools方式。步骤3:验证sysroot中的libdrm版本安装完成后,检查sysroot中是否已更新libdrm:arm-linux-gnueabi-pkg-config--modversionlibdrm#如果PATH中找不到,则用完整路径步骤4:交叉编译Mesa在编译Mesa时,需要指定使用交叉编译的libdrm。同样设置交叉编译环境变量,然后在配置Mesa时通过`--prefix`指定安装到sysroot,并确保PKG_CONFIG_PATH指向sysroot中的.pc文件。示例命令:cdmesa./autogen.sh\--host=arm-linux-gnueabi\--prefix=/path/to/sysroot/usr\--enable-gles2\--enable-egl\--with-egl-platforms='drmfbdev'#根据目标平台选择makemakeinstall步骤5:如果遇到pkg-config找不到libdrm,可以显式指定在配置Mesa时,可以显式指定libdrm的CFLAGS和LDFLAGS:./autogen.sh...\DRM_CFLAGS="-I/path/to/sysroot/usr/include/libdrm"\DRM_LIBS="-L/path/to/sysroot/usr/lib-ldrm"注意事项:1.交叉编译时,所有依赖(如libdrm)都必须用相同的工具链编译并安装到同一个sysroot中。2.如果目标板上的libdrm版本过低,也需要更新目标板上的libdrm库。引用说明:Mesa文档指出,从18.3版本开始,要求libdrm>=2.4.75以支持原子显示操作[^1]。生成相关问题:1.如何设置arm-linux-gnueabi交叉编译环境?2.交叉编译时如何解决其他依赖库的版本问题?3.如何将更新后的Mesa和libdrm部署到ARM开发板?4.交叉编译Mesa时还有哪些常见错误?按照用户要求,使用$...$和$$...$$格式。在回答中我们可能需要使用环境变量设置,比如$CC,所以用$包裹。</think> 为了解决在使用 `arm-linux-gnueabi` 工具链时遇到的 `configure error: Direct rendering requires libdrm >= 2.4.75` 错误,以下是完整的交叉编译解决方案: ### 🔧 分步解决方案(ARM交叉编译环境) 1. **安装ARM工具链依赖** ```bash sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi \ pkg-config-arm-linux-gnueabi meson ninja-build ``` 2. **交叉编译libdrm >= 2.4.75** ```bash wget https://dri.freedesktop.org/libdrm/libdrm-2.4.115.tar.xz tar xf libdrm-2.4.115.tar.xz cd libdrm-2.4.115 # 设置ARM交叉编译环境 export CC=arm-linux-gnueabi-gcc export CXX=arm-linux-gnueabi-g++ export AR=arm-linux-gnueabi-ar export RANLIB=arm-linux-gnueabi-ranlib # ARM交叉编译配置 meson build-arm/ \ --cross-file cross.txt \ --prefix=/usr/arm-linux-gnueabi \ -Dintel=false \ -Dradeon=false \ -Damdgpu=false \ -Dnouveau=false \ -Dvmwgfx=false \ -Dfreedreno=false ninja -C build-arm/ sudo ninja -C build-arm/ install ``` 3. **创建交叉编译配置文件** `cross.txt` ```ini [host_machine] system = 'linux' cpu_family = 'arm' cpu = 'armv7' # 根据目标设备调整 endian = 'little' [binaries] c = 'arm-linux-gnueabi-gcc' cpp = 'arm-linux-gnueabi-g++' ar = 'arm-linux-gnueabi-ar' pkgconfig = 'pkg-config-arm-linux-gnueabi' ``` 4. **验证交叉编译的libdrm** ```bash arm-linux-gnueabi-pkg-config --modversion libdrm # 应输出: 2.4.115 ``` 5. **配置Mesa时指定ARM工具链** ```bash cd mesa-source-directory/ export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig ./configure --host=arm-linux-gnueabi \ --enable-gles2 \ --enable-egl \ --with-platforms=drm \ --with-dri-drivers="swrast" \ --with-gallium-drivers="swrast" make -j$(nproc) ``` ### ⚠️ 关键注意事项 1. **驱动选择性编译** 当GPU驱动未知时,仅编译软件渲染驱动(`swrast`)。确认目标设备GPU型号后可启用特定驱动: ```bash # NVIDIA Tegra设备示例 --with-gallium-drivers="tegra" ``` 2. **库路径验证公式** 确保链接器找到正确版本: $$ \text{ldd --root=/path/to/sysroot} \quad /path/to/mesa/binary \quad | \quad \text{grep libdrm} $$ 输出应符合:`libdrm.so.2 => /usr/arm-linux-gnueabi/lib/libdrm.so.2` 3. **ABI兼容性处理** 对于不同的ARM架构(如ARMv6/v7/v8): - 在 `cross.txt` 中调整 `cpu_family` 和 `cpu` - 添加编译标志:`CFLAGS="-march=armv7-a -mfpu=neon"` 4. **依赖传递性** libdrm的依赖链:Mesa → libdrm → kernel DRM API[^1]。若目标设备内核<4.14,需启用兼容模式: ```bash meson build-arm/ -Dkernel-version=legacy ``` ### 💡 根本原因说明 此错误源于Mesa对DRM原子操作特性的强制要求。原子操作(atomic modesetting)需: - 内核DRM接口版本 ≥ 1.3(对应Linux 3.17+) - $ \text{libdrm} \geq \text{2.4.75} $ 在ARM平台,这些特性是节能渲染的关键基础[^2]。 --- ### 📌 部署建议 将编译产物部署到目标设备后: ```bash # 在ARM设备上验证 MESA_GL_VERSION_OVERRIDE=3.0 glxinfo | grep "OpenGL version" # 应显示基于DRM的软件渲染器 # 检查Direct Rendering状态 eglinfo | grep "DRM platform" # 应返回: ✔ yes ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值