bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

THUMB interlibrary linking may be broken


From: Fred Fish
Subject: THUMB interlibrary linking may be broken
Date: Thu, 11 Oct 2001 16:14:52 -0700 (MST)

I have discovered that if one shared library calls a routine in
another shared library, and both of them are compiled for THUMB, the
linker issues an "unresolvable relocation" warning.  This doesn't
happen if it's generating a executable instead of shared library,
and it also doesn't happen for x86 or ARM objects/libraries.

Here is a typescript that demonstrates the problem by using the x86
compiler, and an arm-elf compiler in both ARM and THUMB mode. The
tested tools were generated from todays head revisions of the gcc,
binutils, and newlib development sources.

Is this a bug, warning about an unimplemented feature, or something
that simply isn't supported?

Thanks.

-Fred  (address@hidden)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Script started on Thu Oct 11 16:01:23 2001
$ cat lib1.c
void PrintString (char* string)
{
}
$ cat lib2.c
void PrintFOO ()
{
  extern void PrintString (char *);
  PrintString("FOO");
}
$ cat Makefile
# Change this to where the tools are installed.
TOOLSROOT = /usr/sourceware/bin

ifdef ARM
CC = $(TOOLSROOT)/arm-elf-gcc
LD = $(TOOLSROOT)/arm-elf-ld
ifdef THUMB
CFLAGS += -mthumb
endif
endif

ifdef X86
CC = $(TOOLSROOT)/gcc
LD = $(TOOLSROOT)/ld
endif

NEWTEST = "======================"

all:
                @echo $(NEWTEST); make clean ; make X86=1 lib2.so
                @echo $(NEWTEST); make clean ; make ARM=1 lib2.so
                @echo $(NEWTEST); make clean ; make ARM=1 THUMB=1 lib2.so

lib1.o:         lib1.c
                $(CC) $(CFLAGS) -c lib1.c

lib2.o:         lib2.c
                $(CC) $(CFLAGS) -c lib2.c

lib1.so:        lib1.o
                $(LD) -e 0 -shared -o lib1.so lib1.o

lib2 lib2.so:   lib2.o lib1.so
                $(LD) -e 0 -shared -o lib2.so lib2.o lib1.so
                $(LD) -e 0 -o lib2 lib2.o lib1.so

clean:
                rm -f lib2 lib1.o lib2.o lib1.so lib2.so
$ make
======================
make[1]: Entering directory 
`/big/links/src/be/bework/src/betools/alpha/bugs/new'
rm -f lib2 lib1.o lib2.o lib1.so lib2.so
make[1]: Leaving directory `/big/links/src/be/bework/src/betools/alpha/bugs/new'
make[1]: Entering directory 
`/big/links/src/be/bework/src/betools/alpha/bugs/new'
/usr/sourceware/bin/gcc  -c lib2.c
/usr/sourceware/bin/gcc  -c lib1.c
/usr/sourceware/bin/ld -e 0 -shared -o lib1.so lib1.o
/usr/sourceware/bin/ld -e 0 -shared -o lib2.so lib2.o lib1.so
/usr/sourceware/bin/ld -e 0 -o lib2 lib2.o lib1.so
make[1]: Leaving directory `/big/links/src/be/bework/src/betools/alpha/bugs/new'
======================
make[1]: Entering directory 
`/big/links/src/be/bework/src/betools/alpha/bugs/new'
rm -f lib2 lib1.o lib2.o lib1.so lib2.so
make[1]: Leaving directory `/big/links/src/be/bework/src/betools/alpha/bugs/new'
make[1]: Entering directory 
`/big/links/src/be/bework/src/betools/alpha/bugs/new'
/usr/sourceware/bin/arm-elf-gcc  -c lib2.c
/usr/sourceware/bin/arm-elf-gcc  -c lib1.c
/usr/sourceware/bin/arm-elf-ld -e 0 -shared -o lib1.so lib1.o
/usr/sourceware/bin/arm-elf-ld -e 0 -shared -o lib2.so lib2.o lib1.so
/usr/sourceware/bin/arm-elf-ld -e 0 -o lib2 lib2.o lib1.so
make[1]: Leaving directory `/big/links/src/be/bework/src/betools/alpha/bugs/new'
======================
make[1]: Entering directory 
`/big/links/src/be/bework/src/betools/alpha/bugs/new'
rm -f lib2 lib1.o lib2.o lib1.so lib2.so
make[1]: Leaving directory `/big/links/src/be/bework/src/betools/alpha/bugs/new'
make[1]: Entering directory 
`/big/links/src/be/bework/src/betools/alpha/bugs/new'
/usr/sourceware/bin/arm-elf-gcc -mthumb -c lib2.c
/usr/sourceware/bin/arm-elf-gcc -mthumb -c lib1.c
/usr/sourceware/bin/arm-elf-ld -e 0 -shared -o lib1.so lib1.o
/usr/sourceware/bin/arm-elf-ld -e 0 -shared -o lib2.so lib2.o lib1.so
/usr/sourceware/bin/arm-elf-ld: lib2.o: warning: unresolvable relocation 
against symbol `PrintString' from .text section
/usr/sourceware/bin/arm-elf-ld -e 0 -o lib2 lib2.o lib1.so
make[1]: Leaving directory `/big/links/src/be/bework/src/betools/alpha/bugs/new'
$ exit

Script done on Thu Oct 11 16:01:38 2001



reply via email to

[Prev in Thread] Current Thread [Next in Thread]