This is the mail archive of the crossgcc@sourceware.org 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] |
First off, here's the problem: Certain memory segments (.rodata.cst4) are being relocated to the beginning of ram, even though they are clearly specified in the linker script to be part of the rest of the .rodata segments. There are only two problem segments, as below, the rest of the .cst4 segments go where they are supposed to. Here is the map file output showing the problem: 0x00023708 0xf C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-strtod.o) *fill* 0x00023717 0x1 00 .rodata 0x00023718 0x184 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-vfprintf.o) .rodata.cst4 0x00000000 0x4 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-vfprintf.o) .rodata.str1.4 0x0002389c 0x5e C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-vfprintf.o) *fill* 0x000238fa 0x2 00 .rodata 0x000238fc 0x101 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-ctype_.o) 0x000238fc _ctype_ *fill* 0x000239fd 0x3 00 .rodata 0x00023a00 0x18 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-dtoa.o) .rodata.cst4 0x00023a18 0x10 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-dtoa.o) 0x24 (size before relaxing) .rodata.cst8 0x00023a28 0x18 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-dtoa.o) .rodata.str1.4 0x00023a40 0x10 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-dtoa.o) 0x12 (size before relaxing) .rodata.str1.4 0x00023a50 0x1b C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-gdtoa-gethex.o) *fill* 0x00023a6b 0x1 00 .rodata.str1.4 0x00023a6c 0x10 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-locale.o) 0x17 (size before relaxing) *fill* 0x00023a7c 0x4 00 .rodata 0x00023a80 0x128 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-mprec.o) 0x00023b80 __mprec_tinytens 0x00023a80 __mprec_tens 0x00023b58 __mprec_bigtens .rodata.cst4 0x00000000 0x8 C:\cross-gcc\powerpc-elf\lib/libc.a(lib_a-mprec.o) Note the entries for mprec.o and vfprintf.o, while the ones for dtoa.o is fine. Here is the part of my linker script that addresses this: .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } > main_ram What ends up happening is many of the re-entrant procedures try to read from whatever's in memory address zero, which is usually a garbage memory location, and crash my code! I was previously using a very old version of LD which did not have this problem, but it ended up overlapping variables which I couldn't exactly accept either. The versions of tools I'm using is: cygwin 1.5.25-15 bintools 20080624-2 (per Cygwin's version string; the -version command gives 2.18.50.20080625) gcc 4.3.2-1 newlib 1.16.0 All these packages, except newlib, where obtained with the Cygwin setup "src" option. Here was my build process: ************************************************************************ ********* * Binutils ************************************************************************ ********* #----------------------------------------------------------------------- ---------- # Source and Install directories #----------------------------------------------------------------------- ---------- SRCDIR=/usr/src/binutils-20080624-2 prefix=/cygdrive/c/cross-gcc #----------------------------------------------------------------------- ---------- # set the target and compiler flags #----------------------------------------------------------------------- ---------- target=powerpc-elf export CFLAGS='-O2 -pipe' export CXXFLAGS='-O2 -pipe' export LDFLAGS='-s' export DEBUG_FLAGS='' export CC='gcc-4' #----------------------------------------------------------------------- ---------- # Build and install binutils #----------------------------------------------------------------------- ---------- rm -rf build-binutils mkdir -p build-binutils cd build-binutils $SRCDIR/configure --prefix=$prefix --target=$target \ --disable-nls --disable-shared --enable-debug --disable-threads \ --with-gcc --with-gnu-as --with-gnu-ld --with-stabs \ --disable-multilib \ 2>&1 | tee binutils_configure.log make all 2>&1 | tee binutils_make.log make install 2>&1 | tee binutils_install.log #----------------------------------------------------------------------- ---------- # Source and Install directories #----------------------------------------------------------------------- ---------- SRCDIR=../../gcc-4.3.2 # the sourcecode dir for gcc # This must be specified in the format shown here # as one of the tools built during the process will fail # if absolute paths are specified # the example here assumes that the gcc source directory # is at the same level as the script #prefix=c:/cross-gcc prefix=/cygdrive/c/cross-gcc # installation directory # This must be specified in the format shown here # or gcc won't be able to find it's libraries and includes # if you move the installation ************************************************************************ ********* * GCC ************************************************************************ ********* #----------------------------------------------------------------------- ---------- # set the path for the installed binutils #----------------------------------------------------------------------- ---------- export PATH=${PATH}:/cygdrive/c/cross-gcc/bin #----------------------------------------------------------------------- ---------- # set the target and compiler flags #----------------------------------------------------------------------- ---------- target=powerpc-elf export CFLAGS='-O2 -pipe' export CXXFLAGS='-O2 -pipe' export LDFLAGS='-s' export DEBUG_FLAGS='' export CC='gcc-4' #----------------------------------------------------------------------- ---------- # build and install just the c compiler #----------------------------------------------------------------------- ---------- rm -rf gcc-build/$target mkdir -p gcc-build/$target cd gcc-build/$target $SRCDIR/configure \ --enable-languages=c,c++ \ --disable-multilib\ --with-gcc --with-gnu-ld --with-gnu-as --with-stabs \ --disable-shared --disable-threads --disable-win32-registry --disable-nls\ --target=$target \ --with-newlib \ --prefix=$prefix -v\ 2>&1 | tee gcc_configure.log make all-gcc | tee make-c-only.log 2>&1 make install-gcc | tee install-c-only.log 2>&1 ************************************************************************ ********* * Newlib ************************************************************************ ********* #----------------------------------------------------------------------- ---------- # Source and Install directories #----------------------------------------------------------------------- ---------- SRCDIR=/usr/src/newlib-1.16.0 prefix=/cygdrive/c/cross-gcc #----------------------------------------------------------------------- ---------- # set the path for the installed binutils and C compiler #----------------------------------------------------------------------- ---------- export PATH=${PATH}:/cygdrive/c/cross-gcc/bin #----------------------------------------------------------------------- ---------- # set target and compiler flags #----------------------------------------------------------------------- ---------- target=powerpc-elf export CC='gcc-4' export CFLAGS='-O2 -pipe' export CXXFLAGS='-O2 -pipe' export LDFLAGS='-s' export DEBUG_FLAGS='' #----------------------------------------------------------------------- ---------- # Build and install newlib #----------------------------------------------------------------------- ---------- rm -r build-newlib mkdir -p build-newlib cd build-newlib $SRCDIR/configure\ --target=$target --prefix=$prefix \ 2>&1 | tee newlib_configure.log make all 2>&1 | tee newlib_make.log make install 2>&1 | tee newlib_install.log Any help would be appreciated. Thanks, Ryan -- For unsubscribe information see http://sourceware.org/lists.html#faq
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |