1

我正在尝试使用 ECOS 构建 Synthetic Linux 目标。我的软件环境:

  • Ubuntu 11.4
  • GCC 4.5.2
  • 生态系统 3.0

在配置工具中,我使用“所有”包设置了“Linux Sythetic”目标。按 F7 (build) 编译开始,但后来它说:

/opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S:汇编程序消息:make:离开目录`/opt/ecos/linux_build' /opt/ecos /ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S:457:错误:__restore_rt 的.size 表达式不计算为常量

/opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S:457:错误:__restore 的 .size 表达式不会计算为常量 make:[src /syscall-i386-linux-1.0.od] 错误 1 ​​make: [build] 错误 2

从第434行开始,文件/opt/ecos/ecos-3.0/packages/hal/synth/i386linux/v3_0/src/syscall-i386-linux-1.0.S的内容是:

// ----------------------------------------------------------------------------
// 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

所以__restore__restore_rt是未定义的。

我试图注释掉这部分并删除与信号相关的包(它说它是一个信号处理程序的东西),但它看起来是 ECOS 内核的基础部分;当部分被注释掉时,构建似乎成功,但是当我编译示例应用程序时,由于缺少符号(cyg_hal_sys_restore)而出现链接器错误。

愚蠢的想法,但我试图用“cyg_hal_sys_restore”和“...rt”相同的方式替换“__restore”,只是为了消除undefs(并不是真的希望错误的代码不会导致错误),结果是:构建是好的(因为没有undefs),示例编译是好的(因为没有丢失的符号),但是示例a.out在我启动它的神圣时刻抛出段错误。

Halp,请,我不熟悉内联 asm 或 ECOS。

4

1 回答 1

0

该问题似乎与binutils有关。在 Debian 上,降级到 2.20.1-16 对我有用。 http://ecos.sourceware.org/ml/ecos-discuss/2011-06/msg00010.html

编辑:点击链接,也有适当的修复。

于 2011-06-03T12:35:47.710 回答