美文网首页
GNU Binutils之objcopy命令

GNU Binutils之objcopy命令

作者: 小田BSP | 来源:发表于2021-05-02 16:59 被阅读0次

    在“Linux内核映像区别”文章中提到了objcopy命令,本文做个简要介绍。

    一、命令介绍

    objcopy命令是GNU Binutils工具集中的一种,其功能为:拷贝和转换目标文件。

    使用objcopy --help查看该命令的使用方法,部分参数如下:

    root@ubuntu:/home/run/code/rockchip-bsp# objcopy --help
    Usage: objcopy [option(s)] in-file [out-file]
     Copies a binary file, possibly transforming it in the process
     The options are:
      ...
      -O --output-target <bfdname>     Create an output file in format <bfdname>
      ...
      -R --remove-section <name>       Remove section <name> from the output
         --remove-relocations <name>   Remove relocations from section <name>
      -S --strip-all                   Remove all symbol and relocation information
      ...
    

    其中:

    1)-O:创建指定输出格式的文件。

    2)-R:从输出文件中移除指定的段。

    3)-S:移除所有的符号表和重定位信息。

    4)...

    二、使用举例

    在编译Linux内核时,使用objcopy命令将elf格式的内核映像vmlinux转为为二进制的内核映像Image

    make命令中增加-n参数,可以显示编译过程中objcopy命令的用法。

    RockPI 4A单板Linux内核编译脚本修改如下:

    root@ubuntu:/home/run/code/rockchip-bsp/build# git diff mk-kernel.sh
    diff --git a/mk-kernel.sh b/mk-kernel.sh
    index cfde0e0b2..2951b8ce0 100755
    --- a/mk-kernel.sh
    +++ b/mk-kernel.sh
    @@ -44,7 +44,7 @@ fi
     cd ${LOCALPATH}/kernel
     [ ! -e .config ] && echo -e "\e[36m Using ${DEFCONFIG} \e[0m" && make ${DEFCONFIG}
    
    -make -j8
    +make -n -j8              ## 增加-n选项
     cd ${LOCALPATH}
    

    内核编译的部分log如下:

    root@ubuntu:/home/run/code/rockchip-bsp# ./build/mk-kernel.sh rockpi4a
      ...
      KSYM    .tmp_kallsyms1.o
      KSYM    .tmp_kallsyms2.o
      LD      vmlinux
      SORTEX  vmlinux
      SYSMAP  System.map
      ...
    make -f ./scripts/Makefile.modpost
    set -e;  echo '  OBJCOPY arch/arm64/boot/Image'; 
    
    ## 使用rk3399对应的交叉编译工具链提供的objcopy命令生成Image
    aarch64-linux-gnu-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S  vmlinux arch/arm64/boot/Image; 
    
    printf '%s\n' 'cmd_arch/arm64/boot/Image := aarch64-linux-gnu-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S  vmlinux arch/arm64/boot/Image' > arch/arm64/boot/.Image.cmd
    echo '  MODPOST 933 modules'; find .tmp_versions -name '*.mod' | xargs -r grep -h '\.ko$' | sort -u | sed 's/\.ko$/.o/' | scripts/mod/modpost   -o ./Module.symvers    -S    -s -T - vmlinux
    

    从上面的日志中可以看出,使用objcopy命令用法为:

    aarch64-linux-gnu-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S  vmlinux arch/arm64/boot/Image
    

    注:本文仅在简书、OSCHINA和今日头条发布过,转载请标注原作者和链接。

    相关文章

      网友评论

          本文标题:GNU Binutils之objcopy命令

          本文链接:https://www.haomeiwen.com/subject/dygtdltx.html