我正在尝试使用 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。