注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lzwml的个人空间 https://home.eeworld.com.cn/space-uid-148817.html [收藏] [复制] [分享] [RSS]
日志

gcc -O3优化后readelf查看地址对齐方式【探讨】

已有 1154 次阅读2014-12-15 10:37

为了给控制端加入的命令特性,我借鉴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

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章