funkcje gcc w jądrze (__ucmpdi2 itp.)

Paweł Sikora pluto w ds14.agh.edu.pl
Wto, 11 Maj 2004, 00:25:30 CEST


On Monday 10 of May 2004 22:26, Jakub Bogusz wrote:
> On Mon, May 10, 2004 at 09:26:18PM +0200, Michal Moskal wrote:
> > On Mon, May 10, 2004 at 09:14:03PM +0200, Jakub Bogusz wrote:
> > > Czy jest jakiś sposób obejścia używania przez gcc funkcji z libgcc do
> > > niektórych operacji nie obsługiwanych bezpośrednio przez procesor, czy
> > > trzeba zawsze dostarczać te funkcje jeśli gcc zapragnie ich użyć?
> > >
> > > Konkretnie to w sterowniku cx88 z 2.4.26 jest użyty switch na typie
> > > __u64 i na ppc gcc porównania chce wykonywać przez funkcję __ucmpdi2(),
> > > której w arch/ppc/lib nie ma (jest tylko dla architektury arm), co
> > > prowadzi oczywiście do unresolved symbols i nieużywalnego modułu.
> >
> > Może to:
> >
> > -ffreestanding    Assume that standard libraries & main might not exist
>
> Nie, to dotyczy bibliotek standardowych języka (czyli np. libc), a nie
> "compiler support library", którą jest libgcc.
> Jak jest tak było:
>
> [builder2 w trumna builder2]$ cat t.c
> #include <stdint.h>
>
> uint64_t x = 0;
>
> int main(int argc)
> {
>         x=argc;
>         switch(x) {
>                 case 1: return 0;
>                 case 2: return 1;
>         }
> }
> [builder2 w trumna builder2]$ gcc -c t.c -ffreestanding
> [builder2 w trumna builder2]$ objdump -t t.o  | grep ucmp
> 00000000         *UND*  00000000 __ucmpdi2

test w pentium3.

[pluto]-[~/sources] # gcc -c -O2 test__ucmpdi2.c
[pluto]-[~/sources] # objdump -t -d test__ucmpdi2.o

test__ucmpdi2.o:     file format elf32-i386

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 test__ucmpdi2.c
00000000 l    d  .text  00000000
00000000 l    d  .data  00000000
00000000 l    d  .bss   00000000
00000000 l    d  .note.GNU-stack        00000000
00000000 l    d  .comment       00000000
00000000 g     O .bss   00000008 x
00000000 g     F .text  00000035 main


Disassembly of section .text:

00000000 <main>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   53                      push   %ebx
   4:   83 ec 04                sub    $0x4,%esp
   7:   31 db                   xor    %ebx,%ebx
   9:   8b 45 08                mov    0x8(%ebp),%eax
   c:   83 e4 f0                and    $0xfffffff0,%esp
   f:   83 ec 10                sub    $0x10,%esp
  12:   a3 00 00 00 00          mov    %eax,0x0
  17:   89 c1                   mov    %eax,%ecx
  19:   c1 f9 1f                sar    $0x1f,%ecx
  1c:   89 0d 04 00 00 00       mov    %ecx,0x4
  22:   83 f0 01                xor    $0x1,%eax
  25:   09 c8                   or     %ecx,%eax
  27:   74 05                   je     2e <main+0x2e>
  29:   bb 01 00 00 00          mov    $0x1,%ebx
  2e:   89 d8                   mov    %ebx,%eax
  30:   8b 5d fc                mov    0xfffffffc(%ebp),%ebx
  33:   c9                      leave
  34:   c3                      ret

-- 
If you think of MS-DOS as mono, and Windows as stereo,
  then Linux is Dolby Digital and all the music is free...



Więcej informacji o liście dyskusyjnej pld-devel-pl