solib-absolute-prefix 和solib-search-path的區別

solib-absolute-prefix 和solib-search-path是 gdb比較常用的選項,用來設置符號文件的位置。

那麼,它們有什麼區別呢?

solib-absolute-prefix設置的是被搜索文件路徑的前綴,solib-search-path設置的是被搜索文件的路徑。

solib-search-path可以有多個路徑,中間按用:隔開,
solib-absolute-prefix的值只能有一個

下面以一個例子說明。

先載入一個 core dump文件:

(gdb) core-file core 
[New LWP 489]
warning: Could not load shared library symbols for 2 libraries, e.g. /mnt/libshared.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Core was generated by `./main'.
Program terminated with signal 11, Segmentation fault.
#0  0x2ac02508 in ?? ()
先執行下 info sharedlibrary:

(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
                        No          /mnt/libshared.so
                        No          /lib/libc.so.6
0x2ab417e0  0x2ab52bf0  Yes (*)     /home/charles/code/gcc-arm-2012.04-linux/arm-linux-gnueabi/libc/lib/ld-linux.so.3
(*): Shared library is missing debugging information.

有兩個動態庫還沒有載入。

假設當前目錄下有文件 libshared.so, 可以執行下面的命令:

(gdb) set solib-search-path .
Reading symbols from /home/charles/libshared.so...done.
Loaded symbols for /home/charles/libshared.so

再看下動態庫的加載情況:

(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
0x2ac0240c  0x2ac02510  Yes         /home/charles/libshared.so
                        No          /lib/libc.so.6
0x2ab417e0  0x2ab52bf0  Yes (*)     /home/charles/code/gcc-arm-2012.04-linux/arm-linux-gnueabi/libc/lib/ld-linux.so.3
(*): Shared library is missing debugging information.

還有一個沒有載入。

假設文件 libc.so.6在 /media/DATA/lib/libc.so.6下:

~$ ls /media/DATA/lib/ -l
total 860
-rw------- 1 charles charles 876656 Nov 18 03:56 libc.so.6

這時,可以用 solib-absolute-path。

(gdb) set solib-absolute-prefix /media/DATA
Reading symbols from /media/DATA/lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /media/DATA/lib/libc.so.6

這時,gdb用前綴 /media/DATA + /lib/libc.so.6,就找到了文件。

/lib 是可執行文件在 目標機上 link libc.so.6的位置。

(gdb) bt full
#0  0x2ac02508 in fun () at testsharedlib.c:3
No locals.
#1  0x00008570 in main () at main.c:6
No locals.
(gdb) l *0x2ac02508
0x2ac02508 is in fun (testsharedlib.c:3).
1    void fun(void)
2    {
3        *(int *)0 = 0;
4    }