This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.
See the CrossGCC FAQ for lots more infromation.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
> I'm trying to replace some functions found in libgcc.a (portions of > fp-bit, specifically). Trouble is, when I link, I get this: > > fp-bit.c(.text+0x320): multiple definition of `__addsf3' > fp-bit.o:fp-bit.c:30: first defined here > /usr/lib/gcc-lib/sh-coff/2.95.2/m2/libgcc.a(fp-bit.o): In function > `__subsf3': > fp-bit.c(.text+0x380): multiple definition of `__subsf3' > > ... and so on. > > I don't get this error when I replace one or more functions in libc or > libm (I'm using the newlib versions). Even more strange, if I copy > fp-bit.c from the gcc sources, modify it, and link it in its entireity, > things seem to work fine as well. If I disturb things in the file > (i.e. remove the portions I'm not modifying, as I did to produce the > above error messages), I start getting complaints again. Hi, Bill. The linker will bring in only the objects (.o files) it needs from each library, but it has to bring in each object in its entirety. It can't link just one portion of an object. So if you copy over all of fp-bit.c to your libc/libm and make the changes you need, leaving the unchanged functions present and intact, all of the fp-bit symbols get resolved from your version, and the linker doesn't need to get fp-bit.o from libgcc. If the fp-bit.o in your libc/libm contains only the functions you changed, and omits the ones you didn't, then the linker needs both copies. Here's why. Let's say fp-bit.c has two functions, foo() and bar(). Let's say you've modified foo(), but the stock bar() is fine for your purposes, so your fp-bit.c in your libc/libm just has your modified foo() and no bar(). Let's say your program calls both foo() and bar() at some point. When linking libc or libm, the linker sees a definition for foo(), which it needs, so it links in your fp-bit.o and resolves foo. But bar is still unresolved. When it gets to libgcc, it finds a definition for bar in that fp-bit.o, so it links in that object also. But because it has to link an entire object, it also gets a second definition of foo along with the definition of bar it wanted. This is the multiple definition error you're seeing. The result is that if you want to replace a function from a library, you need to replace the entire object that the function is defined in, thereby providing your own definitions for all the symbols in that object so that the version in the library will never need to be linked in. Hope that explained it well enough... ------------------------------------------- Carl Miller Firmware Engineer chaz@gordian.com Gordian, Inc. (714) 850-0205 http://www.gordian.com (personal: chaz@devastator.extern.ucsd.edu) ------ Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/ Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |