Debian
我應該為遺留程式碼降級 gcc 嗎?
我繼承了一個看起來像這樣的遺留系統。
$ uname -a Linux pos-sthlm-globe-as-209 2.4.19-dxx #10 Thu Dec 22 15:47:12 CET 2005 i686 GNU/Linux niklros@pos-sthlm-globe-as-209:~$ gcc --version 2.95.4
它有我可以建構的原始碼(它是用於使用的 PCI 卡的 32 位驅動程序):
# make clean test -z "mtn.o" || rm -f mtn.o rm -rf .libs _libs rm -f *.o core *.core rm -f *.lo pos-sthlm-globe-as-209:~/mtn/dxxmtn# ls BusMastHostApi.h bmhostif_parsed.h proc.c uaa.c Makefile cc.c queue.c uaa.h Makefile.am ct812.c ram.c uaa_msg.c Makefile.in drawbridge.c ringbuf.c uniporte_parsed.c PORT dump.c src uniporte_parsed.h TODO log.c telem.c untar UniPorte.h main.c telem_cmd.c usr aaa memring.c telem_cons.c vpd.c ac mtn telem_misc.c bc.c mtn2100.rc tmp bmhostif_parsed.c mtn_poll.c tty.c pos-sthlm-globe-as-209:~/mtn/dxxmtn# make if [ ! -f uniporte_parsed.c -a ! -f uniporte_parsed.h ]; then \ rm -f uniporte_parsed.c uniporte_parsed.h; \ ../utils/grabenum.pl /usr/local/dxx/include/UniPorte.h -header > uniporte_parsed.c; \ for enum in uniporte_managed_object_indices uniport_disconnect_reason_enumeration uniporte_port_state_enumeration ; do \ echo "Grabbing enumerator $enum from /usr/local/dxx/include/UniPorte.h into uniporte_parsed.c..."; \ ../utils/grabenum.pl /usr/local/dxx/include/UniPorte.h $enum -array >> uniporte_parsed.c; \ echo "extern char *$enum[];" >> uniporte_parsed.h; \ ... /usr/src/linux/include/linux/sched.h:770: warning: called from here /bin/sh ../libtool --mode=link gcc -O -D__KERNEL__ -DMODULE -DMODVERSIONS -Wall -Winline -o mtn.o -r uniporte_parsed.o bmhostif_parsed.o uaa.o uaa_msg.o main.o bc.o cc.o mtn_poll.o tty.o ram.o vpd.o drawbridge.o ct812.o dump.o telem.o telem_cmd.o telem_misc.o queue.o ringbuf.o telem_cons.o log.o mkdir .libs /usr/bin/ld -r -o mtn.o uniporte_parsed.o bmhostif_parsed.o uaa.o uaa_msg.o main.o bc.o cc.o mtn_poll.o tty.o ram.o vpd.o drawbridge.o ct812.o dump.o telem.o telem_cmd.o telem_misc.o queue.o ringbuf.o telem_cons.o log.o pos-sthlm-globe-as-209:~/mtn/dxxmtn# ls BusMastHostApi.h ct812.c proc.c tmp Makefile ct812.o queue.c tty.c Makefile.am drawbridge.c queue.o tty.o Makefile.in drawbridge.o ram.c uaa.c PORT dump.c ram.o uaa.h TODO dump.o ringbuf.c uaa.o UniPorte.h log.c ringbuf.o uaa_msg.c aaa log.o src uaa_msg.o ac main.c telem.c uniporte_parsed.c bc.c main.o telem.o uniporte_parsed.h bc.o memring.c telem_cmd.c uniporte_parsed.o bmhostif_parsed.c mtn telem_cmd.o untar bmhostif_parsed.h mtn.o telem_cons.c usr bmhostif_parsed.o mtn2100.rc telem_cons.o vpd.c cc.c mtn_poll.c telem_misc.c vpd.o cc.o mtn_poll.o telem_misc.o pos-sthlm-globe-as-209:~/mtn/dxxmtn#
現在我嘗試在本地機器上的 Virtual Box VM 中複製它,但似乎我失敗了,我認為這是因為 gcc 是版本 3 而不是版本 2。
# uname -a Linux debian 2.4.27-3-386 #1 Wed Dec 6 00:38:33 UTC 2006 i686 GNU/Linux debian:/home/developer/mtn-copy/mtn-copy/mtn/dxxmtn# gcc --version gcc (GCC) 3.3.5 (Debian 1:3.3.5-13) Copyright (C) 2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. debian:/home/developer/mtn-copy/mtn-copy/mtn/dxxmtn# make clean test -z "mtn.o" || rm -f mtn.o rm -rf .libs _libs rm -f *.o core *.core rm -f *.lo debian:/home/developer/mtn-copy/mtn-copy/mtn/dxxmtn# ls aaa gcc-2.95.3.tar proc.c tty.c ac log.c queue.c uaa.c bc.c main.c ram.c uaa.h bmhostif_parsed.c Makefile ringbuf.c uaa_msg.c bmhostif_parsed.h Makefile.am src UniPorte.h BusMastHostApi.h Makefile.in telem.c uniporte_parsed.c cc.c memring.c telem_cmd.c uniporte_parsed.h ct812.c mtn telem_cons.c untar drawbridge.c mtn2100.rc telem_misc.c usr dump.c mtn_poll.c tmp usr-src-linux-include gcc-2.95.3 PORT TODO vpd.c debian:/home/developer/mtn-copy/mtn-copy/mtn/dxxmtn# make if [ ! -f uniporte_parsed.c -a ! -f uniporte_parsed.h ]; then \ rm -f uniporte_parsed.c uniporte_parsed.h; \ ... /usr/src/linux/include/linux/signal.h:205: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here gcc -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/local/dxx/include -I../mtnadm -I/usr/src/linux/include -include /usr/src/linux/include/linux/modversions.h -O -D__KERNEL__ -DMODULE -DMODVERSIONS -Wall -Winline -c telem_misc.c In file included from mtn/mtn.h:436, from mtn/telem_misc.h:28, from telem_misc.c:34: /usr/src/linux/include/linux/malloc.h:4:2: warning: #warning linux/malloc.h is deprecated, use linux/slab.h instead. In file included from mtn/mtn.h:443, from mtn/telem_misc.h:28, from telem_misc.c:34: /usr/src/linux/include/asm/uaccess.h: In function `__constant_copy_from_user': /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/asm/uaccess.h:561: warning: called from here /usr/src/linux/include/asm/siginfo.h: At top level: /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' /usr/src/linux/include/asm/siginfo.h:223: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' /usr/src/linux/include/asm/siginfo.h:226: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:161: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:193: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:205: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here gcc -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/local/dxx/include -I../mtnadm -I/usr/src/linux/include -include /usr/src/linux/include/linux/modversions.h -O -D__KERNEL__ -DMODULE -DMODVERSIONS -Wall -Winline -c queue.c In file included from mtn/mtn.h:436, from mtn/queue.h:54, from queue.c:70: /usr/src/linux/include/linux/malloc.h:4:2: warning: #warning linux/malloc.h is deprecated, use linux/slab.h instead. In file included from mtn/mtn.h:443, from mtn/queue.h:54, from queue.c:70: /usr/src/linux/include/asm/uaccess.h: In function `__constant_copy_from_user': /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/asm/uaccess.h:561: warning: called from here queue.c: In function `mtn_data_queue_add': /usr/src/linux/include/asm/uaccess.h:557: warning: inlining failed in call to `__constant_copy_from_user' queue.c:367: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' queue.c:379: warning: called from here queue.c: In function `mtn_data_queue_get': /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' queue.c:443: warning: called from here /usr/src/linux/include/asm/siginfo.h: At top level: /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' /usr/src/linux/include/asm/siginfo.h:223: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' /usr/src/linux/include/asm/siginfo.h:226: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:161: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:193: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:205: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here gcc -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/local/dxx/include -I../mtnadm -I/usr/src/linux/include -include /usr/src/linux/include/linux/modversions.h -O -D__KERNEL__ -DMODULE -DMODVERSIONS -Wall -Winline -c ringbuf.c ringbuf.c:43:19: errno.h: No such file or directory In file included from ringbuf.c:45: /usr/src/linux/include/asm/uaccess.h: In function `__constant_copy_from_user': /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/asm/uaccess.h:561: warning: called from here In file included from mtn/mtn.h:436, from ringbuf.c:47: /usr/src/linux/include/linux/malloc.h:4:2: warning: #warning linux/malloc.h is deprecated, use linux/slab.h instead. ringbuf.c: In function `mtn_ringbuf_readline': /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:121: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:123: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:124: warning: called from here ringbuf.c: In function `mtn_ringbuf_read': /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:151: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:153: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:154: warning: called from here ringbuf.c: In function `mtn_ringbuf_read_to_user': /usr/src/linux/include/asm/uaccess.h:548: warning: inlining failed in call to `__constant_copy_to_user' ringbuf.c:181: warning: called from here /usr/src/linux/include/asm/uaccess.h:548: warning: inlining failed in call to `__constant_copy_to_user' ringbuf.c:185: warning: called from here /usr/src/linux/include/asm/uaccess.h:548: warning: inlining failed in call to `__constant_copy_to_user' ringbuf.c:185: warning: called from here ringbuf.c: In function `mtn_ringbuf_write': /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:214: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:216: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' ringbuf.c:217: warning: called from here ringbuf.c: In function `mtn_ringbuf_write_from_user': /usr/src/linux/include/asm/uaccess.h:557: warning: inlining failed in call to `__constant_copy_from_user' ringbuf.c:245: warning: called from here /usr/src/linux/include/asm/uaccess.h:557: warning: inlining failed in call to `__constant_copy_from_user' ringbuf.c:249: warning: called from here /usr/src/linux/include/asm/uaccess.h:557: warning: inlining failed in call to `__constant_copy_from_user' ringbuf.c:249: warning: called from here /usr/src/linux/include/asm/siginfo.h: At top level: /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' /usr/src/linux/include/asm/siginfo.h:223: warning: called from here /usr/src/linux/include/asm/string.h:222: warning: inlining failed in call to `__constant_memcpy' /usr/src/linux/include/asm/siginfo.h:226: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:161: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:193: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:205: warning: called from here /usr/src/linux/include/asm/string.h:457: warning: inlining failed in call to `__constant_c_and_count_memset' /usr/src/linux/include/linux/signal.h:149: warning: called from here make: *** [ringbuf.o] Error 1 debian:/home/developer/mtn-copy/mtn-copy/mtn/dxxmtn#
我的結論是否正確,即 VM 中的建構失敗是因為 gcc 版本的不同,還是有其他原因導致建構失敗?
您遇到的嚴重錯誤來自預處理器階段(對於某些
#include <errno.h>
行):ringbuf.c:43:19: errno.h: 沒有這樣的文件或目錄
(其他診斷只是警告;您應該了解它們中的每一個,但您可能 - 可能錯誤地 - 選擇忽略它們;我建議改程序式碼以使用呼叫的最新版本的GCC
-Wall -Wextra
獲得警告,目前GCC 7在 7月2017)在我的 Debian 系統上,
<errno.h>
標頭/usr/include/errno.h
由libc6-dev
軟體包提供。您應該安裝等效的東西。正如我評論的那樣,您的系統上可以有多個版本
gcc
(在我最近的 Debian 上,我可以安裝gcc-5
和gcc-6
&gcc-7
包,我也可以在 下編譯和建構一些最新版本/usr/local/bin/
)。但是,
<errno.h>
它不是編譯器提供的標頭檔,因此安裝另一個GCC (例如降級)將無濟於事。