undefined reference in final kernel link

IceMan iceman@digidude.homeip.net
Fri Oct 20 00:49:00 GMT 2006


    Hello list,

    I am trying to compile a 2.4.26 kernel for an MC9328MXL board (ARM-9tdmi
core) using the latest crosstools 0.42  (my base system is a debian 3.1 r2
release with 2.4.27 kernel).
    I have successfully cross-compiled the test hello-world app and run it
on my target ARM system (MC9328MXL) with the following crosstools setup in
arm9tdmi.sh:

            eval `cat arm9tdmi.dat gcc-3.3.2-glibc-2.3.2.dat`  sh
all.sh -notest
            eval `cat arm9tdmi.dat gcc-3.4.1-glibc-2.3.3.dat`  sh
all.sh --notest

            Both environments produced a successful test app which ran on
the target system. I built the first one because the current kernel on the
MC9328 board was built with this compiler and glibc so I wanted to "stay
standard". Also I only have the patches for that board for the 2.4.26
kernel.

            When I try to compile the already 2.4.26 kernel with a patched
serial routine to access the specific serial console port on the MC9328MXL
(mx1ads.c) board it fails at the end of the compile, when linking the
various objects to the kernel image with an undefined reference:

/opt/crosstool/gcc-3.3.2-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux
-gnu-ld -p -X -T arch/arm/vmlinux.lds arch/arm/kernel/head-armv.o
arch/arm/kernel/init_task.o init/main.o init/version.o init/do_mounts.o \
        --start-group \
        arch/arm/kernel/kernel.o arch/arm/mm/mm.o
arch/arm/mach-mx1ads/mx1ads.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o \
         drivers/l3/l3.o drivers/serial/serial.o drivers/char/char.o
drivers/block/block.o drivers/misc/misc.o drivers/media/media.o
drivers/net/net.o drivers/mtd/mtdlink.o drivers/media/media.o
drivers/net/irda/irda.o \
        net/network.o \
        arch/arm/fastfpe/fast-math-emu.o arch/arm/lib/lib.a
/home/icecool/i-droid/linux-2.4.26/lib/lib.a \
        --end-group \
        -o vmlinux
drivers/serial/serial.o(.text.init+0x41c): In function `$a':
: undefined reference to `mx1_register_gpios'
drivers/serial/serial.o(.text.init+0x438): In function `$a':
: undefined reference to `mx1_register_gpios'
drivers/serial/serial.o(.text.init+0x49c): In function `$a':
: undefined reference to `mx1_unregister_gpios'
drivers/serial/serial.o(.text.init+0x4a8): In function `$a':
: undefined reference to `mx1_unregister_gpios'
make: *** [vmlinux] Error 1

            The function mx1_register_gpios is defined and the header is
present in the arm asm dir - in fact the mx1ads.c compiles successfully:
.
make all_targets
make[3]: Entering directory
`/home/icecool/i-droid/linux-2.4.26/drivers/serial'
/opt/crosstool/gcc-3.3.2-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux
-gnu-gcc -D__KERNEL__ -I/home/icecool/i-droid/linux-2.4.26/include -Wall -Ws
trict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -Uarm -
fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=arm9td
mi -msoft-float -Uarm   -nostdinc -iwithprefix
include -DKBUILD_BASENAME=core  -DEXPORT_SYMTAB -c core.c
core.c:57:1: warning: "pm_unregister" redefined
In file included from
/home/icecool/i-droid/linux-2.4.26/include/linux/modversions.h:253,
                 from
/home/icecool/i-droid/linux-2.4.26/include/linux/module.h:21,
                 from core.c:29:
/home/icecool/i-droid/linux-2.4.26/include/linux/modules/pm.ver:4:1:
warning: this is the location of the previous definition
/opt/crosstool/gcc-3.3.2-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux
-gnu-gcc -D__KERNEL__ -I/home/icecool/i-droid/linux-2.4.26/include -Wall -Ws
trict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -Uarm -
fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=arm9td
mi -msoft-float -Uarm   -nostdinc -iwithprefix
include -DKBUILD_BASENAME=mx1ads   -c -o mx1ads.o mx1ads.c
mx1ads.c: In function `mx1ads_tx_chars':
mx1ads.c:344: warning: unused variable `len'
mx1ads.c: In function `mx1ads_rts_int':
mx1ads.c:417: warning: unused variable `ucr2'
mx1ads.c: At top level:
mx1ads.c:1073: warning: initialization from incompatible pointer type
mx1ads.c:1085: warning: initialization from incompatible pointer type
mx1ads.c:1096: warning: initialization from incompatible pointer type
mx1ads.c:1173: warning: `mx1ads_console_wait_key' defined but not used
rm -f serial.o
/opt/crosstool/gcc-3.3.2-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux
-gnu-ld   -r -o serial.o core.o mx1ads.o
make[3]: Leaving directory
`/home/icecool/i-droid/linux-2.4.26/drivers/serial'
make[2]: Leaving directory
`/home/icecool/i-droid/linux-2.4.26/drivers/serial'


            However when the serial.o object is linked in the end to build
the kernel, I get the above reported error. A 'readelf -s mx1ads.o | grep
register_gpios' (or linked serial.o) gives the following output:

107: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND mx1_register_gpios
110: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND mx1_unregister_gpios

            I don't get this - why would it be unreferenced when the
definition header is present in the arm-asm directory and the serial.o is
linked correctly? I have tried re-arranging the objects in the link with no
results. It seems the cross-compiler linker is failing to notice something -
either that, or I am. Any ideas?

    Thank you in advance.

            Luke



--
For unsubscribe information see http://sourceware.org/lists.html#faq



More information about the crossgcc mailing list