Bug 57799 - gcc-3.1-0.10 fails to build 2.4.17
gcc-3.1-0.10 fails to build 2.4.17
Status: CLOSED RAWHIDE
Product: Red Hat Raw Hide
Classification: Retired
Component: gcc (Show other bugs)
1.0
i386 Linux
high Severity medium
: ---
: ---
Assigned To: Jakub Jelinek
:
Depends On:
Blocks:
  Show dependency treegraph
 
Reported: 2001-12-23 11:56 EST by sean
Modified: 2008-05-01 11:38 EDT (History)
0 users

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Environment:
Last Closed: 2001-12-28 07:01:51 EST
Type: ---
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)

  None (edit)
Description sean 2001-12-23 11:56:34 EST
Description of Problem:
compile of kernel 2.4.17 fails at network.o

Version-Release number of selected component (if applicable):


How Reproducible:


Steps to Reproduce:
1. make bzImage
2. 
3. 

Actual Results:


Expected Results:


Additional Information:
The 2.4.17 kernel DOES build on gcc-3.0.3, without the kernel patch below.

Here are some notes from lkml:

In mailing-lists.linux-kernel, you wrote:

 > I'm trying to build 2.4.17. It fails as follows:
 >
 > net/network.o: In function `__rpc_schedule':
 > net/network.o(.text+0x49a0d): undefined reference to
`rpciod_tcp_dispatcher'

 I've seen this problem while trying to compile recent kernels with
 RedHat Rawhide's gcc-3.10-0.1, are you using that?

 I traced the problem to a conflict in include/linux/sunrpc/clnt.h.  It
 declares rpciod_tcp_dispatcher as extern, but it also includes
 linux/sunrpc/xprt.h, which has a static inline definition of
 rpciod_tcp_dispatcher.  Previous versions of gcc seem to choose the
 static inline definition, while gcc-3.10-0.1 chooses the extern
 declaration.  So I simply deleted the extern declaration from
 linux/sunrpc/clnt.h.

 With this change, the kernel compiles but oopses in do_signal()
 shortly after booting.  jakub@redhat.com logged a similar conflict in
 RedHat Bugzilla 57413, which I paraphrase here:  do_signal() is
 delcared as asmlinkage int FASTCALL in arch/i386/kernel/signal.c, but
 asmlinkage gives the attribute regparm(0), while FASTCALL gives the
 attribute regparm(3).  Again, prior versions of gcc chose regparm(3),
 while gcc-3.1-0.10 chooses regparm(0).  So I simply deleted the
 asmlinkage declaration.

 With these two small changes, kernel 2.4.17 compiles with gcc-3.1-0.10
 and boots on my i386 machine OK.  In fact, I'm writing this under it
 now.  However:

 [whitney@pizza linux-2.4.17-gcc-3.1-0.10]$ grep -r "asmlinkage.*FASTCALL"
.
 ./arch/i386/kernel/vm86.c:asmlinkage struct pt_regs *
 FASTCALL(save_v86_state(struct kernel_vm86_regs * regs));
 ./arch/s390/kernel/signal.c:asmlinkage int FASTCALL(do_signal(struct
pt_regs
 *regs, sigset_t *oldset));
 ./arch/s390x/kernel/signal.c:asmlinkage int FASTCALL(do_signal(struct
pt_regs
 *regs, sigset_t *oldset));
 ./arch/s390x/kernel/signal32.c:asmlinkage int FASTCALL(do_signal(struct
pt_regs
 *regs, sigset_t *oldset));

 Maybe some of these need cleaning up?  I'll have to leave that to the
 experts, I'm more of a grease monkey.

 Cheers,
 Wayne

 diff -rup linux-2.4.17/include/linux/sunrpc/clnt.h
 linux-2.4.17-gcc-3.1-0.10/include/linux/sunrpc/clnt.h
 --- linux-2.4.17/include/linux/sunrpc/clnt.h    Tue Dec 11 13:05:03 2001
 +++ linux-2.4.17-gcc-3.1-0.10/include/linux/sunrpc/clnt.h       Fri Dec 21
19:21:25
 2001
 @@ -136,7 +136,6 @@ rpc_set_timeout(struct rpc_clnt *clnt, u
         xprt_set_timeout(&clnt->cl_timeout, retr, incr);
  }

 -extern void rpciod_tcp_dispatcher(void);
  extern void rpciod_wake_up(void);

  /*
 diff -rup linux-2.4.17/arch/i386/kernel/signal.c
 linux-2.4.17-gcc-3.1-0.10/arch/i386/kernel/signal.c
 --- linux-2.4.17/arch/i386/kernel/signal.c      Sun Sep 23 13:50:09 2001
 +++ linux-2.4.17-gcc-3.1-0.10/arch/i386/kernel/signal.c Fri Dec 21
17:28:51 2001
 @@ -28,7 +28,7 @@

  #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))

 -asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t
*oldset));
 +int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));

  int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  {
Comment 1 Jakub Jelinek 2001-12-28 07:01:46 EST
As for rpciod_tcp_dispatcher, this is going to be fixed in gcc 3.1-0.11,
the other one is kernel problem which will be fixed at least in 2.5.2 and
hopefully 2.4.18 too.

Note You need to log in before you can comment on or make changes to this bug.