为了给控制端加入的命令特性,我借鉴uboot的U_BOOT_CMD方式定义一个端,命名为W_BOOT_CMD,并在Uboot基础上些独有特性。但是我在地址对齐上
遇到个bug,目前
bug已经解决,发帖只是想和大家
探讨关于gcc优化的问题。
如下代码:
W_BOOT_CMDn(cmd1,do_null,"shell help");
W_BOOT_CMDn(cmd2,do_null,"shell help");
W_BOOT_CMDn(cmd3,do_null,"shell help");
W_BOOT_CMDn(cmd4,do_null,"shell help");
连接脚本没使用4字节对齐
------省略----------
. = ALIGN(4);
.rodata : {*(.rodata)}
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = .;
__w_boot_cmd_start = .;
.w_boot_cmd : { *(.w_boot_cmd) }
__w_boot_cmd_end = .;
------省略----------
编译后采用不优化,然后用readelf -s release/download.elf | grep __w查看"__w_boot_cmd_xxx"相关内容
405:
3000997c 0 NOTYPE GLOBAL DEFAULT ABS __w_boot_cmd_start
428: 300099a0 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd4
479: 30009994 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd3
525: 300099ac 0 NOTYPE GLOBAL DEFAULT ABS __w_boot_cmd_end
535: 30009988 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd2
590:
3000997c 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd1
我所定义的结构体的长度是12字节,这4个命令的段地址依次排列start-->cmd1-->cmd2-->cmd3-->cmd4--end,并且start地址和cmd1一样
编译采用-O3(其实-O2优化就出现以下错误),
352:
3000d5fe 0 NOTYPE GLOBAL DEFAULT ABS __w_boot_cmd_start
375:
3000d600 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd4
426: 3000d60c 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd3
472: 3000d630 0 NOTYPE GLOBAL DEFAULT ABS __w_boot_cmd_end
482: 3000d618 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd2
537:
3000d624 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd1
这4个命令的段地址依次排列start-->cmd4-->cmd3-->cmd2-->cmd1--end,并且start不地址不等于cmd4地址相差2字节,编译后地址分配顺序和C语言代码里的相反。
将连接脚本修改成4字节对齐,
. = ALIGN(4);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__w_boot_cmd_start = .;
.w_boot_cmd : { *(.w_boot_cmd) }
__w_boot_cmd_end = .;
352:
3000d600 0 NOTYPE GLOBAL DEFAULT ABS __w_boot_cmd_start
375:
3000d600 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd4
426: 3000d60c 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd3
472: 3000d630 0 NOTYPE GLOBAL DEFAULT ABS __w_boot_cmd_end
482: 3000d618 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd2
537: 3000d624 12 OBJECT GLOBAL DEFAULT 8 __w_boot_cmd_cmd1
本文来自论坛,点击查看完整帖子内容。