arm-linux-gcc mcount_internal undefined reference error
Byron Young
spamiccling@yahoo.com
Wed Sep 22 22:52:00 GMT 2004
Building arm-linux glibc-2.3.3 on an
i386-redhat-linux(gcc-3.3.3) (FC2) system using a
custom built gcc-3.4.0 arm-linux cross compiler
terminates in:
gmon/mcount.c
undefined reference to `mcount_internal'
collect2: ld returned 1 exit status
After some adjustments, the error became a warning:
mcount.c:60: warning: 'mcount_internal' defined but
not used
To avoid the warning
if (0==1) mcount_internal(1,2);
was added to sysdeps/arm/machine-gmon.h #define MCOUNT
definition. With -O1, it was optimized out and did not
appear in the .s file.
Some attached source code (mod.c, mod.h, Makefile,
main.c) simulates this situation.
When compiling with ARM defined (make ARCH=ARM):
-O2 reproduces the undefined reference error.
-O1 reproduces the warning.
-O1 AND if (0==1) gotohello(1,2); compiles with no
warning.
When compiling it with X86 defined (make ARCH=X86):
-O[012] reproduces the warning.
Should the fact that the native gcc does not reproduce
the undefined reference error be a cause for concern?
Instead of if (0==1) gotohello(1,2) to avoid the
warning, is there a gcc extended asm construct that
will alert the compiler of a function reference? The
following all fail: asm("blne mcount_internal;")
produces blne mcount_internal, without compiler noting
a function reference. asm("blne %0" : : "i"
(mcount_internal)); produces blne #mcount_internal,
which is not what is desired.
thanks,
Byron Young
spamiccling@yahoo.com
BEGIN main.c
int
main(int argc, char * argv[], char * envp[]){
return 0;
}
END main.c
BEGIN mod.c
#include "mod.h"
_GOTOHELLO_DECL(from, to)
{
return;
}
HELLO
#ifdef X86
int func1(int i) {
register int _k asm("ebx")=0xF0F0F0F0;
asm ("inc %0" : : "r" (_k));
// asm ("jle %0" : : "i" (gotohello)); ERROR in
.s->.o
// asm ("jle %0" : : "s" (gotohello)); ERROR in
.s->.o
asm ("inc %0" : : "r" (_k));
return 1;
}
#endif
#ifdef ARM
int func1(int i) {
register int _k asm("r3")=1234;
asm("add %0,%1,#1" : "=g" (_k): "g" (_k));
// asm ("blne %0" : : "i" (gotohello)); ERROR in
.s->.o
return _k;
}
#endif
END mod.c
BEGIN mod.h
void _hello(void);
#define weak_alias(name, aliasname) \
extern __typeof(name) aliasname __attribute
((weak, alias (#name)));
weak_alias (_hello, hello)
static void gotohello(int from, int to);
#define _GOTOHELLO_DECL(from, to) \
static void gotohello(int from, int to)
#ifdef ARM
#define HELLO \
void _hello (void) \
{ \
__asm__("stmdb sp!, {r0, r1, r2, r3};" \
"movs fp, fp;" \
"moveq r1, #0;" \
"ldrne r1, [fp, $-4];" \
"ldrne r0, [fp, $-12];" \
"movnes r0, r0;" \
"ldrne r0, [r0, $-4];" \
"movs r0, r0;" \
"blne gotohello;" \
"ldmia sp!, {r0, r1, r2, r3}"); \
if (1==2) gotohello(1,2);
\
}
#endif
#ifdef X86
#define HELLO \
void _hello (void) \
{ \
__asm__("jle gotohello;"
\
"nop;");
\
if (1==2) gotohello(1,2);
\
}
#endif
END mod.h
BEGIN Makefile
all:main
ifndef ARCH
ARCH=ARM
endif
ifeq ($(ARCH),ARM)
else
ifeq ($(ARCH),X86)
else
ARCH=ARM
endif
endif
ifeq ($(ARCH),ARM)
PATH:=/home/bkyoung/arm/bin:/home/bkyoung/arm/arm-linux/bin:$(PATH)
CC=arm-linux-gcc
else
ifeq ($(ARCH),X86)
CC=gcc
endif
endif
CFLAGS=-O1 -D$(ARCH) -g -Wall -Wstrict-prototypes
-Wwrite-strings -fno-omit-frame-pointer
SOURCES=main.c mod.c
OBJS=$(SOURCES:.c=.o)
HEADERS=mod.h
main: $(SOURCES:.c=.o)
$(CC) $(CFLAGS) $^ -o $@
%.i : %.c $(HEADERS) Makefile
$(CC) $(CFLAGS) -E $< -o $@
%.s: %.i
$(CC) $(CFLAGS) -S $< -o $@
%.o: %.s
$(CC) $(CFLAGS) -c $< -o $@
%.o : %.c
clean:
$(RM) *~
$(RM) *.o
$(RM) main
$(RM) *.i
$(RM) *.s
SECONDARY:$(SOURCES:.c=.i) $(SOURCES:.c=.s)
$(SOURCES:.c=.o)
edit:
emacs $(SOURCES:.c=.i) $(SOURCES:.c=.s) $(SOURCES)
$(HEADERS) Makefile
END Makefile
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com
More information about the crossgcc
mailing list