in one special situation I need to use a 64bit devision on a Cortex M3.
Compiling works fine, but the linker trows the following problems:
arm-eCross-eabi-gcc test.o -mcpu=cortex-m3 -mthumb -mlittle-endian
-D__CORTEX__ -nostartfiles
-L/home/ole/work/Streamit/NutOS_M3N/nut/arch/cm3/ldscripts
-Tlpc1778_flash.ld -Wl,-Map=uart.map,--cref,--gc-sections
-L/home/ole/work/Streamit/nut-build-lpc177x_8x/lib
-Wl,--start-group /home/ole/work/Streamit/nut-build-lpc177x_8x/lib/nutinit.o -lnutcrt -lnutarch -lnutdev -lnutos -lnutdev -lnutarch   -Wl,--end-group -o uart.elf
/opt/arm-eCross-eabi/bin/../lib/gcc/arm-eCross-eabi/4.5.2/../../../../arm-eCross-eabi/lib/thumb/v7m/libc.a(lib_a-abort.o): In function `abort':
/home/ole/work/eCross/newlib-build/arm-eCross-eabi/thumb/v7m/newlib/libc/stdlib/../../../../../../../src/newlib-1.19.0/newlib/libc/stdlib/abort.c:63: undefined reference to `_exit'
/opt/arm-eCross-eabi/bin/../lib/gcc/arm-eCross-eabi/4.5.2/../../../../arm-eCross-eabi/lib/thumb/v7m/libc.a(lib_a-signalr.o): In function `_kill_r':
/home/ole/work/eCross/newlib-build/arm-eCross-eabi/thumb/v7m/newlib/libc/reent/../../../../../../../src/newlib-1.19.0/newlib/libc/reent/signalr.c:61: undefined reference to `_kill'
/opt/arm-eCross-eabi/bin/../lib/gcc/arm-eCross-eabi/4.5.2/../../../../arm-eCross-eabi/lib/thumb/v7m/libc.a(lib_a-signalr.o): In function `_getpid_r':
/home/ole/work/eCross/newlib-build/arm-eCross-eabi/thumb/v7m/newlib/libc/reent/../../../../../../../src/newlib-1.19.0/newlib/libc/reent/signalr.c:96: undefined reference to `_getpid'
/opt/arm-eCross-eabi/bin/../lib/gcc/arm-eCross-eabi/4.5.2/../../../../arm-eCross-eabi/lib/thumb/v7m/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
/home/ole/work/eCross/newlib-build/arm-eCross-eabi/thumb/v7m/newlib/libc/reent/../../../../../../../src/newlib-1.19.0/newlib/libc/reent/sbrkr.c:60: undefined reference to `_sbrk'
collect2: ld returned 1 exit status
The program itself looks like this:
#include <inttypes.h>
int main()
{
    uint64_t *a,b;
    volatile uint64_t c;
    a = 0xaa000aa00;
    
    b= 0xaa00aa0000550055;
    
    c = b/(*a);
if (c < 100) return 1;
    while(1);
    return 0;
}
Btw: defining a as pointer is just a trick to trick the optimizer (which
eliminates constant calculations)
Beside the above problem the linker complained about overlapping
sections .data with (implicit?) segments ARM.extab ad ARN.exidx
I fixed this by adding the requested segments (see part of the
lpc17xx_flash.ld linker script below):
   .text :
    {
        . = ALIGN(4);
        _svect = .;
        KEEP(*(.isr_vector))
        _evect = .;
        *(.text .text.* .gnu.linkonce.t.*)
        *(.rodata .rodata* .gnu.linkonce.r.*)
        *(.glue_7t)
        *(.glue_7)
    	*(.gcc_except_table)
	    . = ALIGN(4);
/*        _etext = .;*/
    } > FLASH0
    /* for exception handling/unwind - some Newlib functions (in common
with C++ and STDC++) use this. */
    .ARM.extab : 
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)
    } >  FLASH0
    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } >  FLASH0
    __exidx_end = .;
_etext = .;
    .vtable (NOLOAD):
    {
    	. = ALIGN(4);
	    _vtable = .;
	    *(.vtable*)
    	. = ALIGN(4);
	    _evtable = .;
    } > SRAM0
Does anybody has an idea of what is going wrong here?
Best regards,
Ole Reinhardt
--
Thermotemp GmbH, Embedded-IT
Embedded Hard-/ Software and Open Source Development, 
Integration and Consulting
Geschäftsstelle Siegen - Steinstraße 67 - D-57072 Siegen - 
tel +49 (0)271 5513597, +49 (0)271-73681 - fax +49 (0)271 736 97
Hauptsitz - Hademarscher Weg 7 - 13503 Berlin
Tel +49 (0)30 4315205 - Fax +49 (0)30 43665002
Geschäftsführer: Jörg Friedrichs, Ole Reinhardt
Handelsregister Berlin Charlottenburg HRB 45978 UstID DE 156329280 
_______________________________________________
http://lists.egnite.de/mailman/listinfo/en-nut-discussion
I never had this kind of problem, but I never used 64 bit variables...
But... I compared the local nut/os version for cortexM3 with the
sourceforge one and the only bigger difference is the double -L
parameter for the linker.
You remember the problem I have that building a simple uart example
results in 14k code instead of 6k or less in older versions?
I guess (but didn't test, cause lack of time) that this might be the problem.
Can you test again with
LDFLAGS = ...-T'path/to/linker/ldscript.ld' ... -L'path_to_libs'
instead of
LDFLAGS = ... -L'path/to/linker/' -T'ldscript.ld' ... -L'path_to_libs'
It's just a feeling...
Linker might test the first search path only and include stdlibs on
failing result even the nutos libs exist in the second one.
If it is still needed to have the linker scripts in search path, we
could reorder the parameters and test again:
LDFLAGS = ... -L'path_to_libs' ... -L'path/to/linker/' -T'ldscript.ld'
Ulrich
_______________________________________________
http://lists.egnite.de/mailman/listinfo/en-nut-discussion
    Ulrich> Hi Ole, I never had this kind of problem, but I never used 64
    Ulrich> bit variables...
    Ulrich> But... I compared the local nut/os version for cortexM3 with the
    Ulrich> sourceforge one and the only bigger difference is the double -L
    Ulrich> parameter for the linker.  You remember the problem I have that
    Ulrich> building a simple uart example results in 14k code instead of 6k
    Ulrich> or less in older versions?  I guess (but didn't test, cause lack
    Ulrich> of time) that this might be the problem.
    Ulrich> Can you test again with LDFLAGS =
    Ulrich> ...-T'path/to/linker/ldscript.ld' ... -L'path_to_libs' instead
    Ulrich> of LDFLAGS = ... -L'path/to/linker/' -T'ldscript.ld'
    Ulrich> ... -L'path_to_libs'
    Ulrich> It's just a feeling...  Linker might test the first search path
    Ulrich> only and include stdlibs on failing result even the nutos libs
    Ulrich> exist in the second one.
The order doesn't seem to make a difference:
* Order as produced by our tree:
arm-none-eabi-gcc owi_test.o owi_timer.o -mcpu=cortex-m3 -mthumb -mlittle-endian -D__CORTEX__ -nostartfiles -L../../../devnut_m3n_git/nut/arch/cm3/ldscripts -Tstm32f107xC_flash.ld -Wl,-Map=owi_test.map,--cref,--gc-sections -L../.././lib -Wl,--start-group ../.././lib/nutinit.o -lnutcrt -lnutarch -lnutdev -lnutos -lnutdev -lnutarch   -Wl,--end-group -o owi_test.elf
 > arm-none-eabi-size owi_test.elf
   text    data     bss     dec     hex filename
  24296     320    1380   25996    658c owi_test.elf
* All linker specific files at the end:
> arm-none-eabi-gcc owi_test.o owi_timer.o -mcpu=cortex-m3 -mthumb -mlittle-endian -D__CORTEX__ -nostartfiles -L../.././lib ../.././lib/nutinit.o -lnutcrt -lnutarch -lnutdev -lnutos -lnutdev -lnutarch -nostartfiles -L../../../devnut_m3n_git/nut/arch/cm3/ldscripts -Tstm32f107xC_flash.ld -Wl,-Map=owi_test.map,--cref,--gc-sections -Wl,--start-group -Wl,--end-group -o owi_test.elf
> arm-none-eabi-size owi_test.elf
  text    data     bss     dec     hex filename
  24296     320    1380   25996    658c owi_test.elf
-- 
Uwe Bonnes                b...@elektron.ikp.physik.tu-darmstadt.de
Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
_______________________________________________
http://lists.egnite.de/mailman/listinfo/en-nut-discussion
> The order doesn't seem to make a difference:
Right. And the described problem does not depend on the linked libs (i
tried several combinations). The simple divide test program even did not
need any lib linked at all, does it?
What I found out so far is that gcc implements the division by using a
function "idiv" or similar, which itself depends on these syscalls to be
implemented.
In fact this does not rely to your problem at all. So I think we have
two disjunct problems here.
I just found another thread on microcontroller.net describing the same
problem (but on a different platform) but their solition (to implement
the newlib syscall stubs) is not really satisfying in the Nut/OS
environment... 
What do you think? Where would you implement these syscall stubs (most
of these functions just return 0, only sbrk_r has to be correctly
implemented)
Bye,
Ole
...
    Ole> I just found another thread on microcontroller.net describing the
    Ole> same problem (but on a different platform) but their solition (to
    Ole> implement the newlib syscall stubs) is not really satisfying in the
    Ole> Nut/OS environment...
Can you give a link to that thread?
Thanks
in app/Makevars.cm3-gcc the linker lines where disabled. If you add
back the line
LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT)
-Wl,-Map=$(PROJ).map,--cref,--gc-sections -L$(LIBDIR)
 it works without the overhead.
For latest version it must be modified to LDPATH and LDNAME.
Might be that you have to run 'Create Sampledirectory' from qnutconf
again to apply the modification to the nutconf.mk files.
Creating a local project without this modification results in a binary
image of 90k, with patch applied it is 85k.
Bootloader without patch is 14850 bytes, with patch applied it is 8252 bytes.
Ulrich
Am 7. Februar 2012 17:40 schrieb Uwe Bonnes
<b...@elektron.ikp.physik.tu-darmstadt.de>:
_______________________________________________
http://lists.egnite.de/mailman/listinfo/en-nut-discussion
    Ulrich> Got a part of it: in app/Makevars.cm3-gcc the linker lines where
    Ulrich> disabled. If you add back the line LDFLAGS = $(MCFLAGS)
    Ulrich> -nostartfiles -T$(LDSCRIPT)
    Ulrich> -Wl,-Map=$(PROJ).map,--cref,--gc-sections -L$(LIBDIR) it works
    Ulrich> without the overhead.
Ulrich> For latest version it must be modified to LDPATH and LDNAME.
    Ulrich> Might be that you have to run 'Create Sampledirectory' from
    Ulrich> qnutconf again to apply the modification to the nutconf.mk
    Ulrich> files.
    Ulrich> Creating a local project without this modification results in a
    Ulrich> binary image of 90k, with patch applied it is 85k.  Bootloader
    Ulrich> without patch is 14850 bytes, with patch applied it is 8252
    Ulrich> bytes.
Ulrich,
what exactly is missing from the command
arm-none-eabi-gcc owi_test.o owi_timer.o -mcpu=cortex-m4 -mthumb
-mlittle-endian -D__CORTEX__ -nostartfiles
-L../../../devnut_m3n_git/nut/arch/cm3/ldscripts -Tstm32f405xG_ram.ld
-Wl,-Map=owi_test.map,--cref,--gc-sections -L../.././lib -Wl,--start-group
../.././lib/nutinit.o -lnutcrt -lnutarch -lnutdev -lnutos -lnutdev -lnutarch
-Wl,--end-group -o owi_test.elf
as produced by devnut_m3n-SVN?
Bye
> Can you give a link to that thread?
here it is:
http://embdev.net/topic/129607
It's the english version of microcontroller.net
Btw: It's no problem of cortex but also shows on other platforms as you
read in the thread (they use a ARM7)
bye,
Some days ago there have been problems with linking using 64bit integers and im not shure if a solution was found. I stumbled over the same problem and found the following solution for me (Ethernut 4.10, yagarto).
the following:
---
  /* .ARM.exidx is sorted, so has to go in its own output section.  kl for using long long*/
  .ARM.exidx : {
    __exidx_start = .;
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
  } >rom
---
was added to my .ld file right after the .text segment
Somewhere i had to create the empty functions:
---
void _sbrk(void){
}
void _getpid(void){
}
void _kill(void){
}
void _exit(int status){
	while(1){;}
}
---
But dont ask me why .....
This was all. It wasnt necessary for me to remove the -fno-exceptions -fno-rtti flags like some other descriptions are telling.
Now the int64 are working, i have only little doubts in what situations the _exit functions is called and freezes my prg.
Greetings Klaus
_______________________________________________
http://lists.egnite.de/mailman/listinfo/en-nut-discussion
I've been on a business trip for the last week, so sorry for the late
answer.
> Some days ago there have been problems with linking using 64bit integers and im not shure if a solution was found. I stumbled over the same problem and found the following solution for me (Ethernut 4.10, yagarto).
> the following:
> ---
>   /* .ARM.exidx is sorted, so has to go in its own output section.  kl for using long long*/
>   .ARM.exidx : {
>     __exidx_start = .;
>     *(.ARM.exidx* .gnu.linkonce.armexidx.*)
>     __exidx_end = .;
>   } >rom
> ---
> was added to my .ld file right after the .text segment
> 
> Somewhere i had to create the empty functions:
> ---
> void _sbrk(void){
> }
> 
> void _getpid(void){
> }
> 
> void _kill(void){
> }
> 
> void _exit(int status){
> 	while(1){;}
> }
Yes this is the solution. I decided to go another way and to use only
32bit integers after a redesign of my algorithm.
The mentioned function stubs are the needed "syscall" stubs for Newlib.
In fact they hopefully won't ever be used. The _exit() function will
only be called in case of a "software exeption" like a division by zero.