compile coreutils-8.0.tar.gz to debug version

前言

看到coreutils-8.0.tar.gz中有感興趣的工程,想學學。
這不是新版,新版在http://ftp.gnu.org/pub/gnu/coreutils/
這版好像是測試版(ftp://alpha.gnu.org/gnu/coreutils/)…, 在公司做實驗時,用的是這版,就這樣吧。
下午沒編譯過,可能和手頭的debian8.8有關,有可能沒回到可靠的鏡像點上,可能改了啥吧。
有時腦袋是短路的。

安裝c++全家桶和gdb

apt-get install build-essential
apt-get install gdb

coreutils默認編譯出來的工程是 -g + -O2的,gdb單步的時候有問題。
想將-O2選項去掉,將-O2選項去掉後,文件的創建時間變了,導致configure過不去。
在將工程上傳到debian前,最好將debian的時鐘用date設置成和真機一樣的時間。
vmvare在虛擬機設置=>選項中,也有時鐘和真機同步的選項。

其實最簡單的方法是直接在debian下搞,傳回win10時,打tar包傳回。如果傳回工程文件夾,就純爲了si看代碼。

用linux命令查看應該改回的時間戳, 將configure改回以前的時間戳,再編譯,過了。
學習瞭如何用touch修改文件修改時間。
這時,就可以用gdb去單步感興趣的子工程了。

實驗

去掉-O2選項

上傳coreutils-8.0.tar.gz到虛擬機中的debian8.8

tar -xzvf ./coreutils-8.0.tar.gz

將coreutils-8.0回傳到win10, 建立一個si的工程,搜-O2, 可以看到只有configure中有-O2
在debian中看下configure的修改時間,一會覆蓋掉win上修改的configure後,再將時間改回原版的。

root@debian8:/home/dev/coreutils-8.0# stat ./configure
  文件:"./configure"
  大小:1234819         塊:2416       IO 塊:4096   普通文件
設備:801h/2049d        Inode:4589346     硬鏈接:1
權限:(0755/-rwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
最近訪問:2019-03-07 22:00:55.624048097 +0800
最近更改:2009-10-06 19:05:00.000000000 +0800
最近改動:2019-03-07 22:00:55.632048097 +0800
創建時間:-
root@debian8:/home/dev/coreutils-8.0#

原版configure

elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

修改版configure

elif test $ac_cv_prog_cc_g = yes; then
    CFLAGS="-g"
fi

嘗試編譯

因爲我將虛擬機中的東西都刪了, 編譯的工程都是從win10中重新上傳的,要給下權限

chmod 777 -R /home/dev/coreutils-8.0/
./configure

這時有報錯, 如果將虛擬機時間和真機同步,就沒有下面的報錯。

root@localhost:/home/dev/coreutils-8.0# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... configure: error: newly created file is older than distributed files!
Check your system clock

查看改過的文件和沒改過文件的時間戳

我應該將configure改到舊的時間戳去.

root@localhost:/home/dev/coreutils-8.0# stat configure.ac
  File: ‘configure.ac’
  Size: 15506           Blocks: 32         IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1441854     Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-07 16:27:18.000000000 +0800
Modify: 2009-09-29 21:27:11.000000000 +0800
Change: 2019-03-07 00:40:24.451140859 +0800
 Birth: -

root@localhost:/home/dev/coreutils-8.0# stat configure
  File: ‘configure’
  Size: 1234683         Blocks: 2416       IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1441850     Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-03-07 00:40:40.899140559 +0800
Modify: 2019-03-07 16:40:56.000000000 +0800
Change: 2019-03-07 00:40:24.447140859 +0800
 Birth: -

修改configure時間到原版的時間

主要是文件修改時間

touch -a -m -t 200909292127.11 configure

校驗時間戳是否改到了舊時間

root@localhost:/home/dev/coreutils-8.0# stat configure
  File: ‘configure’
  Size: 1234683         Blocks: 2416       IO Block: 4096   regular file
Device: 801h/2049d      Inode: 1441853     Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-09-29 21:27:11.000000000 +0800
Modify: 2009-09-29 21:27:11.000000000 +0800
Change: 2019-03-07 01:36:52.187079147 +0800
 Birth: -

可以看到文件修改時間已經回到了原版的大概時間

再次嘗試編譯

root@localhost:/home/dev/coreutils-8.0# ./configure

這次看到configure在正常跑了,等着配置完,時間也不長。
再查找所有的Makefile, 可以看到所有的 CFLAGS都是-g, 沒有-O2的。

CFLAGS = -g
root@debian8:/home/dev/coreutils-8.0# find . -name 'Makefile'
./Makefile
./man/Makefile
./lib/Makefile
./src/Makefile
./gnulib-tests/Makefile
./doc/Makefile
./po/Makefile
./tests/Makefile

編譯感興趣的子工程,需要全部編譯

e.g. 假設我只想學習一下rm工程。
好像我開始在公司做實驗的debian虛擬機有問題,明明沒有make rm這個選項,也不報錯,一直在checking
應該在/home/dev/coreutils-8.0主目錄下全部編譯的。

root@debian8:/home/dev/coreutils-8.0# make rm
make: *** No rule to make target 'rm'。 停止。

make all

make all 後,很快就編譯完了。

調試debug版程序

現在所有的工程都編譯成了debug版,假設我對rm工程感興趣。

root@debian8:/home/dev/coreutils-8.0# find . -name 'rm'      
./src/rm
./tests/rm

./src/rm 就是編譯出的debug版可執行文件。

root@debian8:/home/dev/coreutils-8.0# ./src/rm --help
Usage: ./src/rm [OPTION]... FILE...
Remove (unlink) the FILE(s).

開始調試

gdb -tui --args ./src/rm --help
break main
run

可以單步調試了。

總結

將gnu工程由 -g -O2 改到 -g 選項有普遍意義,對學習gnu工程幫助很大。

在公司做實驗時,虛擬機性能也不是那麼差,主要是自己make的命令行搞錯了(也有可能不是在coreutils主目錄下make, 記不清楚了),挫。爲啥公司虛擬機裏面的debian不報錯呢, 還checking的挺歡…

2019-0318

昨天晚上做了實驗,今天到公司,拿新版的gnu-coreutils做了實驗,debug版編譯成功

從 http://ftp.gnu.org/pub/gnu/coreutils/ 下載coreutils最新版本 : coreutils-8.30.tar.xz
將虛擬機和真機時間同步, 重啓虛擬機。

xz -d ./coreutils-8.30.tar.xz

tar -xvf ./coreutils-8.30.tar

將coreutils-8.30目錄傳回win10

用si建立新工程,將coreutils-8.30目錄包含進去,進行代碼走讀

在si中,查找簡單串‘-O2’, 看到configure中有'-O2'

原版的configure關於'-O2'的編譯選項實現

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi

將這些CFLAGS實現,直接換成 CFLAGS="-g" 如下

CFLAGS="-g" /* @todo ls use -g always */

將修改過的coreutils-8.30目錄上傳到debian /home/dev

修改訪問權限
chmod 777 -R ./coreutils-8.30

切到非root用戶
su - lostspeed

/home/dev/coreutils-8.30# ./configure

make all

echo "hello" > /home/dev/test.log
ls -alp /home/dev/test.log
gdb -tui --args ./src/rm /home/dev/test.log
break main
run

可知, 剛生成的rm程序是debug版的,可以正常單步調試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章