Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 May 2003 21:08:13 +0400 (MSD)
From:      Yar Tikhiy <yar@comp.chem.msu.su>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/52764: Impossible to build kernel with COPTFLAGS=-O0 and without INET6
Message-ID:  <200305281708.h4SH8DFj006111@stylish.chem.msu.su>
Resent-Message-ID: <200305281710.h4SHACsq005018@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         52764
>Category:       kern
>Synopsis:       Impossible to build kernel with COPTFLAGS=-O0 and without INET6
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed May 28 10:10:11 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Yar Tikhiy
>Release:        FreeBSD 5.1-BETA i386
>Organization:
Moscow State University
>Environment:
System: FreeBSD stylish.chem.msu.su 5.1-BETA FreeBSD 5.1-BETA #2: Tue May 27 01:50:01 MSD 2003 yar@stylish.chem.msu.su:/usr/obj/usr/src/sys/STYLISH i386

>Description:
	Sometimes a kernel developer needs to build a kernel with
	no optimizations at all, e.g., when he wants to see automatic
	variables and function arguments in stack frames from a
	debugger.  To do so with gcc(1), the developer must compile
	kernel files using a "-O0" option.  (gcc(1) will optimize
	on-stack variables in a way preventing debugging them even
	if given no optimization options.)

	It appears that the FreeBSD kernel will have unresolved
	references to INET6 functions if its files are compiled
	with "-O0", but without INET6.

	The root of the problem is in tcp_input.c.  There are places
	in that file where a C if() operator is used as though it
	were #if.  That is, the condition in the operator will be
	a compile-time constant depending on whether INET6 is
	defined.  In all optimization cases but "-O0", gcc(1) will
	just ignore the code since it appears inside dead "if (0) {}"
	blocks if INET6 is undefined.  But with "-O0", gcc(1) will
	include the code into the object file; and the linker will
	consequently fail to link the kernel.

>How-To-Repeat:
	Add "makeoptions COPTFLAGS=-O0" to a kernel configuration file
	and make sure there is no "options INET6" in it.  Try to build
	such a kernel.  Observe the following linker diagnostics:

linking kernel.debug
tcp_input.o: In function `tcp_input':
../../../netinet/tcp_input.c:400: undefined reference to `in6_cksum'
../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
../../../netinet/tcp_input.c:480: undefined reference to `ip6stat'
tcp_input.o:../../../netinet/tcp_input.c:480: more undefined references to `ip6stat' follow
tcp_input.o: In function `tcp_input':
../../../netinet/tcp_input.c:480: undefined reference to `in6_ifstatmax'
../../../netinet/tcp_input.c:480: undefined reference to `in6_ifstat'
../../../netinet/tcp_input.c:480: undefined reference to `in6_ifstat'
../../../netinet/tcp_input.c:480: undefined reference to `in6_ifstat'
../../../netinet/tcp_input.c:559: undefined reference to `in6_pcblookup_hash'
../../../netinet/tcp_input.c:611: undefined reference to `ip6_sprintf'
../../../netinet/tcp_input.c:612: undefined reference to `ip6_sprintf'
tcp_input.o: In function `tcp_mss':
../../../netinet/tcp_input.c:2618: undefined reference to `tcp_rtlookup6'
../../../netinet/tcp_input.c:2622: undefined reference to `tcp_v6mssdflt'
../../../netinet/tcp_input.c:2641: undefined reference to `tcp_v6mssdflt'
../../../netinet/tcp_input.c:2688: undefined reference to `nd_ifinfo'
../../../netinet/tcp_input.c:2690: undefined reference to `in6_localaddr'
../../../netinet/tcp_input.c:2691: undefined reference to `tcp_v6mssdflt'
../../../netinet/tcp_input.c:2768: undefined reference to `in6_localaddr'
tcp_input.o: In function `tcp_mssopt':
../../../netinet/tcp_input.c:2805: undefined reference to `tcp_rtlookup6'
../../../netinet/tcp_input.c:2809: undefined reference to `tcp_v6mssdflt'
*** Error code 1

Stop in /usr/src/sys/i386/compile/TESTO0.

>Fix:
	Left up to the developer who introduced such a bug.
	As a workaround, "options INET6" needs to be included
	in a kernel configuration file if the kernel will be
	built with "-O0" for debugging purposes.
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305281708.h4SH8DFj006111>