我的应用程序
obuspa
在执行uci_lookup_ptr
链接库的标准OpenWRT库调用libuci.so
时崩溃。加载器在链接库列表中显示该库,如下所示
# /lib/ld-linux.so.3 --list /sbin/obuspa
libmosquitto.so.1 => /usr/lib/libmosquitto.so.1 (0xb68de000)
libubus.so => /usr/lib/libubus.so (0xb68cf000)
libubox.so => /usr/lib/libubox.so (0xb68bb000)
libblobmsg_json.so => /usr/lib/libblobmsg_json.so (0xb68b0000)
libuci.so => /lib/libuci.so (0xb689e000)
libc.so.6 => /lib/libc.so.6 (0xb6766000)
/lib/ld-linux.so.3 (0xb6f2d000)
如果使用如下所示的 ld_preload 在 shell 环境中设置相同的库,并重新启动应用程序,则进程运行良好并且根本没有收到任何
SIGSEGV
信号。因此,没有SEGFAULT
。
export LD_PRELOAD=/lib/libuci.so
如何设置相同的共享库路径,避免进程崩溃。
您可以使用
export LD_PRELOAD=/lib/libuci.so
文件制作 /etc/ld.so.preload
:
仅将行
/lib/libuci.so
添加到文件 /etc/ld.so.preload
,您可能需要创建它。
来自man 8 ld.so:
/etc/ld.so.preload
包含以空格分隔的 ELF 共享列表的文件 在程序之前加载的对象。请参阅 上面
的讨论。如果 LD_PRELOAD 和LD_PRELOAD
已受聘,指定图书馆 by/etc/ld.so.preload
首先预加载。LD_PRELOAD
有 系统范围的影响,导致指定的库 为在上执行的所有程序预加载 系统。 (这通常是不可取的,并且通常是 仅用作紧急补救措施,例如,作为 库配置错误问题的临时解决方法。)/etc/ld.so.preload
如果您不想使用
/etc/ld.so.preload
文件,您可以创建一个脚本文件,每次尝试启动 LD_PRELOAD
时都会设置 obuspa
:
obuspa.sh
#! /bin/sh
export LD_PRELOAD=/lib/libuci.so
/sbin/obuspa "$@"
当您使用 LD_PRELOAD 时,这会更改 .so 库的加载顺序,即首先加载 libuci.so,然后是其他库。
现在,您的代码中可能存在一些内存损坏,这最初损坏了加载 libuci.so 的内存,或者 libuci.so 使用并期望具有严格值的内存,并且当您调用该函数时它崩溃了。
现在发生的情况可能是另一个库中的某些其他函数(例如 libc.so)被损坏。但由于您从不调用那个损坏的函数,因此不会发生崩溃。
您需要更深入地了解您的代码:您是否在某处遇到错误并将空指针传递给另一个函数?您是否将缓冲区传递给写入的数据多于缓冲区可以容纳的数据的函数?
这些事情追踪起来很棘手且令人沮丧,但最终找到问题是令人满意的;-)祝你好运!