2014-02-23 75 views
0

我下載了libc6的源代碼併成功完成了構建過程。 (雖然我沒有刻意執行make install)。通過鏈接器運行程序時出現Seg錯誤?

隨着buil-dir/elf/ld.so內建的新鏈接器,我運行了一個程序,將它作爲參數提供給新建的鏈接器。

  • 該測試代碼打印一些字符串,然後malloc(sizeof(char)*1024)

  • 在運行測試二進制作爲參數傳遞給新建的連接,我得到一個Seg Faultelf/dl-addr.c:132是:

    131 /* Protect against concurrent loads and unloads. */

    132 __rtld_lock_lock_recursive (GL(dl_load_lock));

  • 這是賽格前的最後一幀通過malloc()調用來自測試程序的調用。

堆棧跟蹤在這一點上:

#0 0x0000000000000000 in ??() 
#1 0x00007f11a6a94928 in __GI__dl_addr (address=0x7f11a69e67a0 <ptmalloc_init>, info=0x7fffe9393be0, mapp=0x7fffe9393c00, symbolp=0x0) at dl-addr.c:132 
#2 0x00007f11a69e64d7 in ptmalloc_init() at arena.c:381 
#3 0x00007f11a69e72b8 in ptmalloc_init() at arena.c:371 
#4 malloc_hook_ini (sz=<optimized out>, caller=<optimized out>) at hooks.c:32 
#5 0x00000000004005b3 in main() at test.c:20 

在運行使用默認的相同的程序安裝連接器的機器上的程序運行正常。

  • 我無法理解這背後的問題是什麼? (難道是因爲我使用新建的鏈接器而不安裝它第一個)

-任何建議或指針,高度讚賞。 感謝

(系統信息GCC 4.8.22, eglibc-2.15 Ubuntu 12.10 64bit

+0

你應該已經安裝了你的新libc。但是,我相信你手動升級它是錯誤的。將你的發行版升級到更新版本的Ubuntu。 –

+0

@BasileStarynkevitch我必須修改鏈接器並測試它是否按照更改工作(現在沒有代碼更改了)。有沒有一種方法可以爲此測試新建的鏈接器? – abhi

+1

然後我會建議在一個'chroot' ed環境中安裝一個迷你分發和實驗 –

回答

1

通過內置在buil-dir/elf/ld.so的新連接器我跑了一個程序作爲參數傳遞給新建的連接提供它。

它那所有你那麼崩潰是預計,因爲你正在混合新建的裝載機與系統庫(這是行不通的: 全部部分glibc必須來自它的相同構建)。

你需要做的是:

buil-dir/elf/ld.so \ 
    --library-path buil-dir:buil-dir/dlfcn:buil-dir/nptl:... \ 
    /path/to/a.out 

目錄的列表來搜索必須包括所有的庫(glibc的部分),你的程序使用。

+0

因此,我必須基本將build目錄中的所有文件夾添加爲命令行參數中的庫路徑,同時運行新建ld.so – abhi

+0

一個快速查詢 - 如果我的一個程序使用libsssl或任何其他不是作爲libc的一部分構建的庫,那麼在這種情況下,是否需要使用新建的libc和鏈接器再次構建它們,否則以前的那個將會足夠了? – abhi

+0

我在問這個問題,因爲我必須用Apache(httpd)來測試修改後的鏈接器,它使用libssl,libcrypto等許多庫,這些庫不是作爲Libc的一部分構建的。謝謝 – abhi

相關問題