1

我习惯于从 C 代码中获取漂亮的列表文件,在那里我可以看到可爱的源代码与操作码和十六进制偏移交织在一起以进行调试,如下所示:List File In C (.LST) List File In C (.LST)

-S 指令仅从 g++ 为 Ada 获取汇编代码....但我似乎无法让它放弃好东西,所以我可以调试一个令人讨厌的精化崩溃。

关于 GNAT 编译器开关发送的任何想法?

4

2 回答 2

2

您可能想查看绝密 GNAT 文档中有关调试控制的部分,尤其是 -gnatG 开关。

于 2020-08-22T10:20:24.423 回答
2

也许这有帮助。下一个命令生成类似于您所指的内容:

$ gnatmake -g main.adb -cargs -Wa,-adhln > main.lst

-cargs所谓的模式切换)导致gnatmake将后续参数传递给编译器。编译器随后将这些-adhln开关传递给汇编器(参见此处)。但是您也可以objdump -d -S main.o在构建后使用来查看程序集/源代码。

主文件

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin
   Put_Line ("Hello, world!");
end Main;

输出(main.lst)

   1                    .file   "main.adb"
   2                    .text
   3                .Ltext0:
   4                    .section    .rodata
   5                .LC1:
   6 0000 48656C6C      .ascii  "Hello, world!"
   6      6F2C2077 
   6      6F726C64 
   6      21
   7 000d 000000        .align 8
   8                .LC0:
   9 0010 01000000      .long   1
  10 0014 0D000000      .long   13
  11                    .text
  12                    .align 2
  13                    .globl  _ada_main
  15                _ada_main:
  16                .LFB1:
  17                    .file 1 "main.adb"
   1:main.adb      **** with Ada.Text_IO; use Ada.Text_IO;
   2:main.adb      **** 
   3:main.adb      **** procedure Main is
  18                    .loc 1 3 1
  19                    .cfi_startproc
  20 0000 55            pushq   %rbp
  21                    .cfi_def_cfa_offset 16
  22                    .cfi_offset 6, -16
  23 0001 4889E5        movq    %rsp, %rbp
  24                    .cfi_def_cfa_register 6
  25 0004 53            pushq   %rbx
  26 0005 4883EC08      subq    $8, %rsp
  27                    .cfi_offset 3, -24
  28                .LBB2:
   4:main.adb      **** begin
   5:main.adb      ****    Put_Line ("Hello, world!");
  29                    .loc 1 5 4
  30 0009 B8000000      movl    $.LC1, %eax
  30      00
  31 000e BA000000      movl    $.LC0, %edx
  31      00
  32 0013 4889C1        movq    %rax, %rcx
  33 0016 4889D3        movq    %rdx, %rbx
  34 0019 4889D0        movq    %rdx, %rax
  35 001c 4889CF        movq    %rcx, %rdi
  36 001f 4889C6        movq    %rax, %rsi
  37 0022 E8000000      call    ada__text_io__put_line__2
  37      00
  38                .LBE2:
   6:main.adb      **** end Main;
  39                    .loc 1 6 5
  40 0027 4883C408      addq    $8, %rsp
  41 002b 5B            popq    %rbx
  42 002c 5D            popq    %rbp
  43                    .cfi_def_cfa 7, 8
  44 002d C3            ret
  45                    .cfi_endproc
  46                .LFE1:
  48                .Letext0:
于 2020-08-21T06:45:34.990 回答