我习惯于从 C 代码中获取漂亮的列表文件,在那里我可以看到可爱的源代码与操作码和十六进制偏移交织在一起以进行调试,如下所示:List File In C (.LST) List File In C (.LST)
-S 指令仅从 g++ 为 Ada 获取汇编代码....但我似乎无法让它放弃好东西,所以我可以调试一个令人讨厌的精化崩溃。
关于 GNAT 编译器开关发送的任何想法?
我习惯于从 C 代码中获取漂亮的列表文件,在那里我可以看到可爱的源代码与操作码和十六进制偏移交织在一起以进行调试,如下所示:List File In C (.LST) List File In C (.LST)
-S 指令仅从 g++ 为 Ada 获取汇编代码....但我似乎无法让它放弃好东西,所以我可以调试一个令人讨厌的精化崩溃。
关于 GNAT 编译器开关发送的任何想法?
您可能想查看绝密 GNAT 文档中有关调试控制的部分,尤其是 -gnatG 开关。
也许这有帮助。下一个命令生成类似于您所指的内容:
$ 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: