r2 - 15 Feb 2007 - 17:08:09 - IuriDinizYou are here: TWiki >  Personal Web  >  CrossCompiler > CrossTool

Configurando um Cross Compile

Crosstool

#!/bin/sh

mkdir Downloads
cd Downloads
wget http://kegel.com/crosstool/crosstool-0.43.tar.gz
tar xvzf crosstool-0.43.tar.gz

mips 32 (mipsel)

gcc/g++ 4.0.2 e glibc 2.3.6

#!/bin/sh
cd crosstool-0.43
TARBALLS_DIR=$HOME/Downloads
RESULT_TOP=$HOME/cross/mipsel-linux
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
eval `cat mipsel.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest

Não vai funcionar, precisa patchear 2 arquivos da glibc

ref: http://gcc.gnu.org/ml/gcc/2005-04/msg01051.html
file: sysdeps/unix/sysv/linux/mips/mips32/sysdep.h

--- glibc-2.3.6/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h    2004-10-18 02:16:06.000000000 -0300
+++ glibc-2.3.6-patched/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h    2007-01-15 12:00:57.000000000 -0200
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -48,12 +48,12 @@
 #undef INLINE_SYSCALL
 #define INLINE_SYSCALL(name, nr, args...)                               \
   ({ INTERNAL_SYSCALL_DECL(err);                                       \
-     long result_var = INTERNAL_SYSCALL (name, err, nr, args);         \
-     if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) )                 \
-       {                                                                \
-         __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));       \
-         result_var = -1L;                                             \
-       }                                                                \
+     long result_var = INTERNAL_SYSCALL (name, err, nr, args);         \
+     if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) )                 \
+       {                                                               \
+        __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));        \
+        result_var = -1L;                                              \
+       }                                                               \
      result_var; })
 
 #undef INTERNAL_SYSCALL_DECL
@@ -66,209 +66,218 @@
 #define INTERNAL_SYSCALL_ERRNO(val, err)     (val)
 
 #undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, err, nr, args...) internal_syscall##nr(name, err, args)
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
+       internal_syscall##nr (, "li\t$2, %2\t\t\t# " #name "\n\t",      \
+                             "i" (SYS_ify (name)), err, args)
+
+#undef INTERNAL_SYSCALL_NCS
+#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
+       internal_syscall##nr (= number, , "r" (__v0), err, args)
 
-#define internal_syscall0(name, err, dummy...)                                \
-({                                                                     \
+#define internal_syscall0(ncs_init, cs_init, input, err, dummy...)     \
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a3 asm("$7");                                   \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "li\t$2, %2\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       ".set reorder"                                                  \
-       : "=r" (__v0), "=r" (__a3)                                      \
-       : "i" (SYS_ify(name))                                           \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a3 asm("$7");                                   \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       ".set reorder"                                                  \
+       : "=r" (__v0), "=r" (__a3)                                      \
+       : input                                                         \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall1(name, err, arg1)                             \
-({                                                                     \
+#define internal_syscall1(ncs_init, cs_init, input, err, arg1)         \
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a3 asm("$7");                                   \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "li\t$2, %3\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       ".set reorder"                                                  \
-       : "=r" (__v0), "=r" (__a3)                                      \
-       : "r" (__a0), "i" (SYS_ify(name))                               \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a3 asm("$7");                                   \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       ".set reorder"                                                  \
+       : "=r" (__v0), "=r" (__a3)                                      \
+       : input, "r" (__a0)                                             \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall2(name, err, arg1, arg2)                       \
-({                                                                     \
+#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2)   \
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a1 asm("$5") = (long) arg2;                     \
-       register long __a3 asm("$7");                                   \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "li\t$2, %4\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       ".set\treorder"                                                 \
-       : "=r" (__v0), "=r" (__a3)                                      \
-       : "r" (__a0), "r" (__a1), "i" (SYS_ify(name))                   \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a1 asm("$5") = (long) arg2;                     \
+       register long __a3 asm("$7");                                   \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       ".set\treorder"                                         \
+       : "=r" (__v0), "=r" (__a3)                                      \
+       : input, "r" (__a0), "r" (__a1)                                 \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall3(name, err, arg1, arg2, arg3)                        \
-({                                                                     \
+#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3)\
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a1 asm("$5") = (long) arg2;                     \
-       register long __a2 asm("$6") = (long) arg3;                     \
-       register long __a3 asm("$7");                                   \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "li\t$2, %5\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       ".set\treorder"                                                 \
-       : "=r" (__v0), "=r" (__a3)                                      \
-       : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name))       \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a1 asm("$5") = (long) arg2;                     \
+       register long __a2 asm("$6") = (long) arg3;                     \
+       register long __a3 asm("$7");                                   \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       ".set\treorder"                                         \
+       : "=r" (__v0), "=r" (__a3)                                      \
+       : input, "r" (__a0), "r" (__a1), "r" (__a2)                     \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall4(name, err, arg1, arg2, arg3, arg4)           \
-({                                                                     \
+#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4)\
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a1 asm("$5") = (long) arg2;                     \
-       register long __a2 asm("$6") = (long) arg3;                     \
-       register long __a3 asm("$7") = (long) arg4;                     \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "li\t$2, %5\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       ".set\treorder"                                                 \
-       : "=r" (__v0), "+r" (__a3)                                      \
-       : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name))       \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a1 asm("$5") = (long) arg2;                     \
+       register long __a2 asm("$6") = (long) arg3;                     \
+       register long __a3 asm("$7") = (long) arg4;                     \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       ".set\treorder"                                         \
+       : "=r" (__v0), "+r" (__a3)                                      \
+       : input, "r" (__a0), "r" (__a1), "r" (__a2)                     \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall5(name, err, arg1, arg2, arg3, arg4, arg5)     \
-({                                                                     \
+/* We need to use a frame pointer for the functions in which we
+   adjust $sp around the syscall, or debug information and unwind
+   information will be $sp relative and thus wrong during the syscall.  As
+   of GCC 3.4.3, this is sufficient.  */
+#define FORCE_FRAME_POINTER alloca (4)
+
+#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5)\
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
+       FORCE_FRAME_POINTER;                                            \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a1 asm("$5") = (long) arg2;                     \
-       register long __a2 asm("$6") = (long) arg3;                     \
-       register long __a3 asm("$7") = (long) arg4;                     \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "lw\t$2, %6\n\t"                                                \
-       "subu\t$29, 32\n\t"                                             \
-       "sw\t$2, 16($29)\n\t"                                           \
-       "li\t$2, %5\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       "addiu\t$29, 32\n\t"                                            \
-       ".set\treorder"                                                 \
-       : "=r" (__v0), "+r" (__a3)                                      \
-       : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)),      \
-         "m" ((long)arg5)                                              \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a1 asm("$5") = (long) arg2;                     \
+       register long __a2 asm("$6") = (long) arg3;                     \
+       register long __a3 asm("$7") = (long) arg4;                     \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       "subu\t$29, 32\n\t"                                             \
+       "sw\t%6, 16($29)\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       "addiu\t$29, 32\n\t"                                            \
+       ".set\treorder"                                         \
+       : "=r" (__v0), "+r" (__a3)                                      \
+       : input, "r" (__a0), "r" (__a1), "r" (__a2),                    \
+         "r" ((long)arg5)                                              \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall6(name, err, arg1, arg2, arg3, arg4, arg5, arg6)\
-({                                                                     \
+#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6)\
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
+       FORCE_FRAME_POINTER;                                            \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a1 asm("$5") = (long) arg2;                     \
-       register long __a2 asm("$6") = (long) arg3;                     \
-       register long __a3 asm("$7") = (long) arg4;                     \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "lw\t$2, %6\n\t"                                                \
-       "lw\t$8, %7\n\t"                                                \
-       "subu\t$29, 32\n\t"                                             \
-       "sw\t$2, 16($29)\n\t"                                           \
-       "sw\t$8, 20($29)\n\t"                                           \
-       "li\t$2, %5\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       "addiu\t$29, 32\n\t"                                            \
-       ".set\treorder"                                                 \
-       : "=r" (__v0), "+r" (__a3)                                      \
-       : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)),      \
-         "m" ((long)arg5), "m" ((long)arg6)                            \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a1 asm("$5") = (long) arg2;                     \
+       register long __a2 asm("$6") = (long) arg3;                     \
+       register long __a3 asm("$7") = (long) arg4;                     \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       "subu\t$29, 32\n\t"                                             \
+       "sw\t%6, 16($29)\n\t"                                           \
+       "sw\t%7, 20($29)\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       "addiu\t$29, 32\n\t"                                            \
+       ".set\treorder"                                         \
+       : "=r" (__v0), "+r" (__a3)                                      \
+       : input, "r" (__a0), "r" (__a1), "r" (__a2),                    \
+         "r" ((long)arg5), "r" ((long)arg6)                            \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \
        _sys_result;                                                    \
 })
 
-#define internal_syscall7(name, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
-({                                                                     \
+#define internal_syscall7(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
+({                                                                     \
        long _sys_result;                                               \
                                                                        \
+       FORCE_FRAME_POINTER;                                            \
        {                                                               \
-       register long __v0 asm("$2");                                   \
-       register long __a0 asm("$4") = (long) arg1;                     \
-       register long __a1 asm("$5") = (long) arg2;                     \
-       register long __a2 asm("$6") = (long) arg3;                     \
-       register long __a3 asm("$7") = (long) arg4;                     \
-       __asm__ volatile (                                              \
-       ".set\tnoreorder\n\t"                                           \
-       "lw\t$2, %6\n\t"                                                \
-       "lw\t$8, %7\n\t"                                                \
-       "lw\t$9, %8\n\t"                                                \
-       "subu\t$29, 32\n\t"                                             \
-       "sw\t$2, 16($29)\n\t"                                           \
-       "sw\t$8, 20($29)\n\t"                                           \
-       "sw\t$9, 24($29)\n\t"                                           \
-       "li\t$2, %5\t\t\t# " #name "\n\t"                               \
-       "syscall\n\t"                                                   \
-       "addiu\t$29, 32\n\t"                                            \
-       ".set\treorder"                                                 \
-       : "=r" (__v0), "+r" (__a3)                                      \
-       : "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)),      \
-         "m" ((long)arg5), "m" ((long)arg6), "m" ((long)arg7)          \
-       : __SYSCALL_CLOBBERS);                                          \
+       register long __v0 asm("$2") ncs_init;                          \
+       register long __a0 asm("$4") = (long) arg1;                     \
+       register long __a1 asm("$5") = (long) arg2;                     \
+       register long __a2 asm("$6") = (long) arg3;                     \
+       register long __a3 asm("$7") = (long) arg4;                     \
+       __asm__ volatile (                                              \
+       ".set\tnoreorder\n\t"                                           \
+       "subu\t$29, 32\n\t"                                             \
+       "sw\t%6, 16($29)\n\t"                                           \
+       "sw\t%7, 20($29)\n\t"                                           \
+       "sw\t%8, 24($29)\n\t"                                           \
+       cs_init                                                         \
+       "syscall\n\t"                                                   \
+       "addiu\t$29, 32\n\t"                                            \
+       ".set\treorder"                                         \
+       : "=r" (__v0), "+r" (__a3)                                      \
+       : input, "r" (__a0), "r" (__a1), "r" (__a2),                    \
+         "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7)          \
+       : __SYSCALL_CLOBBERS);                                          \
        err = __a3;                                                     \
        _sys_result = __v0;                                             \
        }                                                               \

ref: http://sourceware.org/ml/libc-alpha/2005-12/msg00025.html
file: sysdeps/mips/dl-machine.h

--- glibc-2.3.6/sysdeps/mips/dl-machine.h       2004-11-24 02:36:09.000000000 -0200
+++ glibc-2.3.6-patched/sysdeps/mips/dl-machine.h       2007-01-15 13:57:29.000000000 -0200
@@ -528,7 +528,7 @@
 /* Perform the relocation specified by RELOC and SYM (which is fully resolved).
    MAP is the object containing the reloc.  */
 
-static inline void
+auto inline void
 #ifdef RTLD_BOOTSTRAP
   __attribute__ ((always_inline))
 #endif
@@ -635,14 +635,14 @@
     }
 }
 
-static inline void
+auto inline void
 elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
                          void *const reloc_addr)
 {
   /* XXX Nothing to do.  There is no relative relocation, right?  */
 }
 
-static inline void
+auto inline void
 elf_machine_lazy_rel (struct link_map *map,
                      ElfW(Addr) l_addr, const ElfW(Rel) *reloc)
 {
@@ -651,7 +651,7 @@
 
 #ifndef RTLD_BOOTSTRAP
 /* Relocate GOT. */
-static inline void
+auto inline void
 elf_machine_got_rel (struct link_map *map, int lazy)
 {
   ElfW(Addr) *got;
@@ -738,7 +738,7 @@
 /* Set up the loaded object described by L so its stub function
    will jump to the on-demand fixup code __dl_runtime_resolve.  */
 
-static inline int
+auto inline int
 elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 {
 # ifndef RTLD_BOOTSTRAP

-- IuriDiniz - 15 Jan 2007

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r2 < r1 | More topic actions
 
Powered by TWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback