Problems during shifting syscalls from /sys to /libgloss
Jeff Johnston
jjohnstn@redhat.com
Fri Jun 22 16:11:00 GMT 2007
Hi Bhushan,
I'm afraid I can't help you much with this particular problem
remotely. You're going to
have to do some debugging and find out where it is getting _read from
and why
it didn't get your version. If you use nm (for your platform) with the
-l option, you
should be able to figure out which file the executable is using for _read.
e.g. mn10300-elf-nm -l a.out
-- Jeff J.
Bhushan Attarde wrote:
> Hi Jeff,
>
> First of all thanks for your reply.
> I followed your suggestion and the problem of undefined references got
> solved and the applications are getting compiled successfully.
>
> But now I got stuck into another problem........
>
> We have our own defined syscall functions(_read, _write) for serial port
> read/write operations. These functions are implemented in syscalls.c as
> a source file.
>
> But during application compilation libgloss syscalls functions are not
> getting replaced by our own defined sycalls. This was not a problem when
> syscalls were in libc/sys/.
>
> This can be seen from disassembly listing (lss) files.
>
> When sycalls were in libc/sys :
> ...................
> .................
> 00c008d6 <__read>:
> int _read (int file, char *ptr, int len)
> {
> c008d6: 88 10 mov [-r0],r1
> c008d8: f0 10 mov r1,r0
> c008da: 26 f0 08 00 sub r0,#0x8
> c008de: ec f2 push r2
> c008e0: ec f3 push r3
> c008e2: c4 81 fe ff mov [r1+#0xfffe],r8
> c008e6: c4 a1 fc ff mov [r1+#0xfffc],r10
> c008ea: c4 91 fa ff mov [r1+#0xfffa],r9
> c008ee: c4 b1 f8 ff mov [r1+#0xfff8],r11
> *ptr=getkey();
> c008f2: da c0 28 08 calls #seg:0xc0,#sof:0x828
> c008f6: d4 31 fc ff mov r3,[r1+#0xfffc]
> c008fa: d4 21 fa ff mov r2,[r1+#0xfffa]
> c008fe: dc 43 extp r3,#0x1
> c00900: b9 82 movb [r2],rl4
> return (1);
> c00902: e0 12 mov r2,#0x1
> }
> c00904: f0 42 mov r4,r2
> c00906: fc f3 pop r3
> c00908: fc f2 pop r2
> c0090a: 06 f0 08 00 add r0,#0x8
> c0090e: 98 10 mov r1,[r0+]
> c00910: db 00 rets
> ..........................
>
>
>
> When sycalls are now in /libgloss :
> ..........................
> ..........................
> 00c0e780 <__read>:
> c0e780: 88 10 mov [-r0],r1
> c0e782: f0 10 mov r1,r0
> c0e784: e0 1b mov r11,#0x1
> c0e786: f0 99 mov r9,r9
> c0e788: f0 aa mov r10,r10
> c0e78a: da c0 ac e7 calls #seg:0xc0,#sof:0xe7ac
> c0e78e: 98 10 mov r1,[r0+]
> c0e790: db 00 rets
> .....................
>
>
> So what is the problem ?
> Did we miss something like macros etc.?
> What should I need to do?
>
> Thanks in advance
>
> --Bhushan
>
>
> -----Original Message-----
> From: Jeff Johnston [mailto:jjohnstn@redhat.com]
> Sent: Friday, June 15, 2007 9:46 PM
> To: Bhushan Attarde
> Cc: newlib@sources.redhat.com; crossgcc@sources.redhat.com
> Subject: Re: Problems during shifting syscalls from /sys to /libgloss
>
> Bhushan Attarde wrote:
>
>> Hi,
>>
>>
>> We are working on GNU based tool chain for infineon xc16x
>> microcontroller.
>> Currently the syscalls are in /newlib/libc/sys and we are trying to
>> shift them to /libgloss.
>>
>> So after some google search we found some way to do that.......
>> And done some changes which are as follows:
>>
>>
>> * newlib-1.15.0/configure.in : removed target-libgloss from
>> noconfigdirs for xc16x-*-*
>> * configure : regenrate
>> * newlib-1.15.0/newlib/configure.host: : set sys_dir to empty for
>> xc16x-*-
>> And set syscall_dir to xc16x
>>
>> * configure : regenerate
>> * newlib/libc/sys/xc16x/ configure.in : removed
>> * newlib/libc/sys/xc16x/ configure : removed
>>
>> * newlib/libc/sys/xc16x/ crt0.s : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ close.s : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ create.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ getchar1.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ isatty.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ lseek.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ mem-layout : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ misc.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ open.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ putchar.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ puts.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ read.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ sbrk.c: moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ syscalls.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ trap-handle.c : moved to libgloss/xc16x
>> * newlib/libc/sys/xc16x/ write.c : moved to libgloss/xc16x
>>
>> * newlib/libc/sys/xc16x : reomoved
>>
>> * libgloss/xc16x/configure.in : new
>> * libgloss/xc16x/configure : regenerate
>>
>>
>>
>> With these changes I built the tool chain, it got built without any
>> error.
>>
>> But when I tried to compile one of our sample program I got the
>> following errors...............
>>
>>
>>
>>
> /home/bhushana/XC16X/run/xc16x-elf/lib/gcc/xc16x-elf/4.2.0/../../../../x
>
>> c16x-elf/lib/xc16xl/libg.a(lib_a-makebuf.o): In function
>>
> `___smakebuf':
>
>> makebuf.c:(.text+0x1fb): undefined reference to `_isatty'
>>
>> makebuf.c:(.text+0x1fc): undefined reference to `_isatty'
>>
>>
>>
> /home/bhushana/XC16X/run/xc16x-elf/lib/gcc/xc16x-elf/4.2.0/../../../../x
>
>> c16x-elf/lib/xc16xl/libg.a(lib_a-sbrkr.o): In function `__sbrk_r':
>>
>> sbrkr.c:(.text+0x1d): undefined reference to `__sbrk'
>>
>> sbrkr.c:(.text+0x1e): undefined reference to `__sbrk'
>>
>>
>>
> /home/bhushana/XC16X/run/xc16x-elf/lib/gcc/xc16x-elf/4.2.0/../../../../x
>
>> c16x-elf/lib/xc16xl/libg.a(lib_a-closer.o): In function `__close_r':
>>
>> closer.c:(.text+0x1b): undefined reference to `__close'
>>
>> closer.c:(.text+0x1c): undefined reference to `__close'
>>
>>
>>
> /home/bhushana/XC16X/run/xc16x-elf/lib/gcc/xc16x-elf/4.2.0/../../../../x
>
>> c16x-elf/lib/xc16xl/libg.a(lib_a-fstatr.o): In function `__fstat_r':
>>
>> fstatr.c:(.text+0x25): undefined reference to `__fstat'
>>
>> fstatr.c:(.text+0x26): undefined reference to `__fstat'
>>
>>
>>
> /home/bhushana/XC16X/run/xc16x-elf/lib/gcc/xc16x-elf/4.2.0/../../../../x
>
>> c16x-elf/lib/xc16xl/libg.a(lib_a-lseekr.o): In function `__lseek_r':
>>
>> lseekr.c:(.text+0x2d): undefined reference to `__lseek'
>>
>> lseekr.c:(.text+0x2e): undefined reference to `__lseek'
>>
>> collect2: ld returned 1 exit status
>>
>> make: *** [Mathtest.out] Error 1
>>
>>
>>
>> what went wrong ? Or the changes are incomplete and needs to do more?
>> What should I need to do?
>>
>>
>
> Hi Bhushan,
>
> Don't forget that the compiler needs to be informed of your change as
>
> well when it adds library references when linking. If you have
> introduced a new library, you will have to either refer to it manually
> on your compile/link command or you will need to modify the compiler so
> it adds it automatically.
>
> A common way of implementing libgloss is to use an ld script. The ld
>
> script contains all the information needed to link so all that is needed
>
> is to add: -Txxxx.ld to the compile/link command. This is useful in the
>
> case of multiple board configurations as you can have yyyy.ld and
> zzzz.ld, etc... One could modify the compiler to add options to do this
>
> automatically on behalf of the end-user (e.g. -mxxxxx translates to
> -Txxxxx.ld when linking) or if there is only one choice to hardwire the
> needed reference.
>
> Check out libgloss/mn10300/sim.ld for an example of an ld script.
> Note the GROUP directive to repeatedly search the given libraries.
>
> -- Jeff J.
>
--
For unsubscribe information see http://sourceware.org/lists.html#faq
More information about the crossgcc
mailing list