Search code examples
ecos

Problem building ECOS for "Linux Synthetic" target


I'm trying to building Synthetic Linux target with ECOS. My software environment:

  • Ubuntu 11.4
  • GCC 4.5.2
  • ECOS 3.0

In the Config Tool I have set up "Linux Sythetic" target with "all" packages. Pressing F7 (build) the compilation starts, but later it says:

/opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S: Assembler messages: make: Leaving directory `/opt/ecos/linux_build' /opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S:457: Error: .size expression for __restore_rt does not evaluate to a constant

/opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S:457: Error: .size expression for __restore does not evaluate to a constant make: [src/syscall-i386-linux-1.0.o.d] Error 1 make: [build] Error 2

The content of the file /opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S from the line 434 is:

// ----------------------------------------------------------------------------
// Special support for returning from a signal handler. In theory no special
// action is needed, but with some versions of the kernel on some
// architectures that is not good enough. Instead returning has to happen
// via another system call.         

        .align 16
        .global cyg_hal_sys_restore_rt
cyg_hal_sys_restore_rt:
        movl    $SYS_rt_sigreturn, %eax
        int     $0x80
1:              
        .type __restore_rt,@function
        .size __restore_rt,1b - __restore_rt

        .align 8
        .global cyg_hal_sys_restore
cyg_hal_sys_restore:
        popl    %eax
        movl    $SYS_sigreturn, %eax
        int     $0x80
1:              
        .type __restore,@function
        .size __restore,1b - __restore

So the __restore and __restore_rt is undefinied.

I've tried to comment out this part and remove signal-related packages (it says, that it is a signal handler stuff), but it looks to be the base part of the ECOS kernel; the build seems succeed when parts are outcommented, but when I compile example apps, there are linker error because of the missing symbols (cyg_hal_sys_restore).

Silly idea, but I've tried to replace "__restore" with "cyg_hal_sys_restore" and "...rt" same way, just to eliminate undefs (not really hoping that the wrong code causes no error), and the result is: the build is ok (as there're no undefs), example compiling is ok (as no missing symbols), but example a.out throws segfault just at the holy moment I start it.

Halp, pls., I'm not familiar with inline asm nor ECOS.


Solution

  • The problem seems to be related to binutils. On Debian, a downgrade to 2.20.1-16 worked for me. http://ecos.sourceware.org/ml/ecos-discuss/2011-06/msg00010.html

    EDIT: Follow link, there's a proper fix too.