首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改objdump输出格式?

如何更改objdump输出格式?
EN

Stack Overflow用户
提问于 2019-07-01 09:53:08
回答 1查看 920关注 0票数 2

嗨,我正在学习这本书的c编译器。https://www.sigbus.info/compilerbook

我想展示和这本书一样的结果。我该怎么做?我想我需要改变gcc的版本,或者选择。

这本书说,它也有可能从以下预期的汇编输出编译。

  • 期望的
代码语言:javascript
复制
.intel_syntax noprefix
.global main
main:
        mov rax, 42
        ret
  • 实际
代码语言:javascript
复制
00000000000005fa <main>:
 5fa:   55                      push   rbp
 5fb:   48 89 e5                mov    rbp,rsp
 5fe:   b8 2a 00 00 00          mov    eax,0x2a
 603:   5d                      pop    rbp
 604:   c3                      ret
 605:   66 2e 0f 1f 84 00 00    nop    WORD PTR cs:[rax+rax*1+0x0]
 60c:   00 00 00
 60f:   90                      nop
  • 我所做的
代码语言:javascript
复制
root@686394c78009:/zcc# uname -a
Linux 686394c78009 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

root@686394c78009:/zcc# objdump -v
GNU objdump (GNU Binutils for Ubuntu) 2.30
Copyright (C) 2018 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

root@686394c78009:/zcc# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04.1' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

root@686394c78009:/zcc# cat test1.c
int main() {
  return 42;
}
root@686394c78009:/zcc# gcc -o test1 test1.c
root@686394c78009:/zcc# ./test1
root@686394c78009:/zcc# echo $?
42
root@686394c78009:/zcc# objdump -d -M intel ./test1

更新1

使用-S选项生成的程序集代码。从生成的程序集代码编译。

尽管与我的参考书有一些不同,但我会学到更多。

另一个奇怪的事情是,不同的寄存器名分别被使用。我也会调查的。(我意识到我需要向基础学习。)

代码语言:javascript
复制
// expected
mov rax, 42

// actual
mov eax, 42 
代码语言:javascript
复制
root@686394c78009:/zcc# gcc -S -masm=intel test1.c

root@686394c78009:/zcc# cat test1.s
    .file   "test1.c"
    .intel_syntax noprefix
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp
    .cfi_def_cfa_register 6
    mov eax, 42
    pop rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
    .section    .note.GNU-stack,"",@progbits

root@686394c78009:/zcc# gcc -o test1 test1.s
root@686394c78009:/zcc# ./test1
root@686394c78009:/zcc# echo $?
42
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 10:38:53

不要使用objdump转储,而是使用编译器的-S选项直接生成程序集代码。使用-masm=intel,输出应该与您预期的类似。

不过,不要期望编译器生成完全相同的代码。不同的编译器和不同的编译器版本,甚至同一个带有不同标志的编译器,可能会为相同的代码做出不同的选择并生成不同的程序集。这很正常。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56833532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档