This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Undefined reference to strlen, although library is supplied


Hello everybody,

first, I'd like to thank everyone who responded to my first mail concerning the powerpc-eabi compiler build. Especially, I found Kai's hints the most productive ones, and by taking his steps into consideration, the build was just a piece of cake.

I am now trying to build a simple C++ application with my powerpc-eabi compiler. I have written an appropriate linker configuration file that fits my target development board (a Phytec phyCORE-MPC555 hooked up using the Wiggler interface, just in case one likes to know).

The final link fails due to an undefined reference to strlen. However, this function is present in libc.a, and even though I tell the linker to use libc.a, it keeps complaining. An objdump reveals its presence, the linker flags seem fine to me, so how come it doesn't link properly?

I tried to build my application earlier with success by using a pre-defined architecture (such as ads, yellowknife etc.) Then, the linking stage finishes properly. Now, I want to leave out the -mads option. I created a system.o file that contains the required system functions (_exit, sbrk, getpid, and kill) with a minimal implementation similar to those suggested in the Newlib documentation.

To make things a little clearer, here are the error messages and some dumps:

$ make all
powerpc-eabi-gcc -mcpu=505 -c src/system.c -o src/system.o
powerpc-eabi-gcc -mcpu=505 -c src/main.cc -o src/main.o
powerpc-eabi-gcc -mcpu=505 -c src/LED.cc -o src/LED.o
powerpc-eabi-gcc -T phycore555.ld -o build/blinky++.elf src/system.o src/LED.o src/main.o -lstdc++ -lg -lc
/usr/local/lib/gcc-lib/powerpc-eabi/3.3.2/../../../../powerpc-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00802000
/usr/local/lib/gcc-lib/powerpc-eabi/3.3.2/libgcc.a(unwind-dw2.o)(.text+0x3e4): In function `extract_cie_info':
/home/gem/crossgcc/gcc-3.3.2/gcc/unwind-dw2.c:247: undefined reference to `strlen'
/usr/local/lib/gcc-lib/powerpc-eabi/3.3.2/libgcc.a(unwind-dw2.o)(.text+0xd08): In function `execute_cfa_program':
/home/gem/crossgcc/gcc-3.3.2/gcc/unwind-dw2.c:820: undefined reference to `memcpy'
----(Snip)----------------------------------------------------------------------


powerpc-eabi-nm tells me that strlen as well as memcpy are defined.
An objdump of libc.a also shows me their presences.

$ powerpc-eabi-objdump -d -X `powerpc-eabi-gcc -print-file-name=libc.a`

----(Snip)----------------------------------------------------------------------
strlen.o:     file format elf32-powerpc
rw-r--r-- 16162/22680   7244 Feb  6 10:26 2004 strlen.o
architecture: powerpc:common, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

....

Disassembly of section .text:

00000000 <strlen>:
   0:   70 60 00 03     andi.   r0,r3,3
   4:   94 21 ff e0     stwu    r1,-32(r1)
   8:   7c 6a 1b 78     mr      r10,r3
   c:   40 82 00 44     bne-    50 <strlen+0x50>
----(Snip)----------------------------------------------------------------------

I don't understand why the linker doesn't resolve the references. Maybe I am still not supplying the right flags to it, but maybe it's a totally different problem that I am not yet aware about. What also bothers me is that by supplying -mads (or -myellowknife) to the linker (without my system.o) the linking stage succeeds. It seems likely to me that there are still things left to consider.

If I am not totally mislead, I believe that, in addition, I still need to write startup code for my target. By leaving out -mads it is not using any crt0, is it? What does actually need to be done in crt0? Is it sufficient to just set up the initial stack frame? To make global variables work, specific processor registers also need to be set up, as far as I know (I think they are R2, table of contents, and R13, global data, but I will do more research on that). What else needs to be included in a typical crt0 for an embedded target such as mine?

----(Snip)----------------------------------------------------------------------
/usr/local/lib/gcc-lib/powerpc-eabi/3.3.2/libgcc.a(eabi.o)(.text+0xc4): In function `__eabi':
/home/gem/crossgcc/build-gcc/gcc/eabi.S:232: undefined reference to `__init'
----(Snip)----------------------------------------------------------------------


Anyway, IMHO, a missing crt0 does not explain the unresolved strlen and memcpy references. There must be another reason for that.

I am about to dig a littler deeper into the predefined libglosses (reading sources). I am still new to embedded development, and this is a very nice adventure trip for me.

So this is why I am asking kindly for another push into the right direction. Such a discussion on the mailing list might also be helpful for others digging into this subject as well.

Thank you all.

Hermann



------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]