victor
发布于

linux开发必备查错技能

1. 查看库或执行程序的依赖关系?

objdump -x cjson_demo | grep NEEDED
root@55ce0fbe4b63:private# objdump -x cjson_demo | grep NEEDED
NEEDED libcjson.so.1
NEEDED libc.so.6

2. 如碰到编译 link 错误,需要确认库内相关函数是否存在?

查看动态导出函数
方法一

nm -D **.so

但这样能看到所有的导出,乱七八糟的很多,筛选用:

nm **.so | grep XX

方法二

objdump -tT **.so

查看静态导出函数

nm -g --defined-only libxxx.a

eg. 查看 libcjson.so 是否存在 cJSON_AddItemReferenceToArray

root@55ce0fbe4b63:cJSON-1.7.14# nm libcjson.so |grep cJSON_AddItemReferenceToArray
00005dd8 T cJSON_AddItemReferenceToArray

3. 确认编译库和程序程序的 CPU 架构,以便确认是否可以在对应的 CPU 架构上运行?(X86/ARM/MIPS...)

ARM CPU

root@55ce0fbe4b63:cJSON-1.7.14# file cJSON_test
cJSON_test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, with debug_info, not stripped

X86 CPU

root@55ce0fbe4b63:cJSON-1.7.14-x86# file cJSON_test
cJSON_test: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=745b1e7811c5cc45393c6d65e32e65bb7ead7bad, not stripped

4. 设置运行依赖库路径,以确保程序可以正常链接到开发的库

Linux 设置库路径环境变量 LD_LIBRARY_PATH
未设置 inogui 依赖库 LD_LIBRARY_PATH 时,异常日志如下:

eg. root@inoneos:/usr/inonegui# ./inogui
Error loading shared library libts.so.0: No such file or directory (needed by ./inogui)
Error loading shared library libinogui.so: No such file or directory (needed by ./inogui)
Error loading shared library liblz4.so.1: No such file or directory (needed by ./inogui)
Error loading shared library libiconv.so.2: No such file or directory (needed by ./inogui)

设置 inogui 依赖库 LD_LIBRARY_PATH=/usr/inonegui/lib 时,正常日志如下:

root@inoneos:/usr/inonegui# export LD_LIBRARY_PATH=/usr/inonegui/lib
root@inoneos:/usr/inonegui# ./inogui
[INOGUI] ============INONEGUI version = INONEGUI: Jan 5 2022 23:11:32 =============
[INOGUI] [activitymanage.cpp:SetSysCfgKeyValue] LTGUICFG_KEY_I_GCFG, eGestureMode:0 iGestureMinDist:10 iGestureMaxTime:200
[INOGUI] [DoInit] InvalidRectManage W-H:800,480
[INOGUI] [DoInit] Start DisplayManage [OK].

5. 预先加载库环境变量【用于 overlay 已有库或库内部分函数,即同名函数优先使用预先加载库】

LD_PRELOAD
如系统内有比较旧的 libcjson 和 libz 库,再不修改文件系统情况下,可以采用下面方式实现。
export LD_PRELOAD=/tmp/libcjson.so.1:/tmp/libz.so

浏览 (682) 点赞 (1) 收藏 分享
评论