我目前正在學習帶有 att 語法的 x86 匯編程式。在過去的時間里,我已經撰寫了沒有依賴關系的練習程式。現在我想嘗試撰寫一個共享的共享庫,因為這是我大部分時間在 C 中所做的。
我認為撰寫一個簡單的“測驗”程式可能是個好主意,該程式由一個用 asm 撰寫的測驗庫和一個鏈接到該測驗庫的程式組成。
我組裝了圖書館:as -32 prog.s -o prog.o
和呼叫者:as -32 startprog.s -o startprog.o
在我組裝了這兩個檔案之后,我在庫上運行了聯結器,ld -melf_i386 -fPIE -shared prog.o -o libprog.so
并在呼叫者上運行ld -melf_i386 startprog.o -L./ -lprog -o startprog
到目前為止,一切正常。但是后來我嘗試運行程式./startprog,這導致了段違規。我重新運行gdb并設定_start
為斷點。當我進入rgdb 開始執行時,我收到了相同的 SIGSEGV。它似乎發生在libc write()
函式中。至少那是,我能做些什么。
完整的輸出如下所示:
[cediw@cwm10 pC $] gdb ./startprog
Reading symbols from ./startprog...
(No debugging symbols found in ./startprog)
(gdb) b _start
Breakpoint 1 at 0x8049020
(gdb) r
Starting program: /home/cediw/dev/asm/re/pC/startprog
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
Program received signal SIGSEGV, Segmentation fault.
0xf7f06fe1 in write () from /usr/lib/libc.so.1
(gdb) disas
Dump of assembler code for function write:
0xf7f06fd0 < 0>: push %esi
0xf7f06fd1 < 1>: push
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457489.html
標籤:assembly x86 shared-libraries libc position-independent-code
