.dbug_loc отсутствует в двоичном файле

Я проверял двоичный файл ELF на предмет кода, упомянутого ниже. Я скомпилировал его на gcc 7.4.0 в системе Ubuntu x86_64 в Virtual Box как:

gcc -g scratch1.c -o scratch1.out

#include <stdio.h>
void do_stuff(int my_arg){
    int my_local = my_arg + 2;
    int i;
    for (i = 0; i < my_local; ++i) printf("i = %d\n", i);
}

int main(){
    do_stuff(2);
    return 0;
}

Однако, когда я попытался обратиться к разделу .debug_loc, он был пуст.

objdump --dwarf=loc scratch1.out

scratch1.out:     file format elf64-x86-64

Хотя я вижу некоторые другие разделы debug_

[26] .debug_aranges    PROGBITS         0000000000000000  0000103b
       0000000000000030  0000000000000000           0     0     1
[27] .debug_info       PROGBITS         0000000000000000  0000106b
       000000000000035f  0000000000000000           0     0     1
[28] .debug_abbrev     PROGBITS         0000000000000000  000013ca
       0000000000000125  0000000000000000           0     0     1
[29] .debug_line       PROGBITS         0000000000000000  000014ef
       00000000000000e6  0000000000000000           0     0     1
[30] .debug_str        PROGBITS         0000000000000000  000015d5
       00000000000002b5  0000000000000001  MS       0     0     1

Нужна ваша помощь, почему этот раздел отсутствует.


person ultimate cause    schedule 30.10.2019    source источник


Ответы (1)


Нужна ваша помощь, почему этот раздел отсутствует.

Раздел .debug_loc содержит DW_AT_location списков, обычно создаваемых только для оптимизированного кода.

Поскольку вы скомпилировали без оптимизации, компилятор не выдал этот раздел. Попробуйте построить с помощью:

gcc -g -O3 scratch1.c -o scratch1.out

Вот что я вижу с gcc 8.3.0:

$ gcc -g scratch.c && readelf -WS a.out | grep debug_loc
  # no output

$ gcc -g scratch.c -O3 && readelf -WS a.out | grep debug_loc
  [32] .debug_loc        PROGBITS        0000000000000000 0039db 000230 00      0   0  1
person Employed Russian    schedule 31.10.2019
comment
Спасибо, не знал об этом - я получаю это даже для уровня O1. - person ultimate cause; 31.10.2019