I have a program with debug and release version. Here's their size:
[root@build]$ ll -h debug release
-rwxr-xr-x. 1 root root 12M Dec 29 11:49 debug
-rwxr-xr-x. 1 root root 3.6M Dec 29 11:51 release
I want to distinguish debug version and release version on linux with just one or two commands, but i don't know how to do that. When I compile my programs with option -g, debug version was created. And here's command readelf -S debug output:
There are 41 section headers, starting at offset 0xa0bb88:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
00000000000132f0 0000000000000004 A 4 0 8
[ 4] .dynsym DYNSYM 0000000000413568 00013568
0000000000042fd8 0000000000000018 A 5 1 8
[ 5] .dynstr STRTAB 0000000000456540 00056540
00000000000dfa70 0000000000000000 A 0 0 1
[ 6] .gnu.version VERSYM 0000000000535fb0 00135fb0
0000000000005952 0000000000000002 A 4 0 2
[ 7] .gnu.version_r VERNEED 000000000053b908 0013b908
0000000000000250 0000000000000000 A 5 9 8
[ 8] .rela.dyn RELA 000000000053bb58 0013bb58
0000000000000c78 0000000000000018 A 4 0 8
[ 9] .rela.plt RELA 000000000053c7d0 0013c7d0
0000000000002958 0000000000000018 A 4 11 8
[10] .init PROGBITS 000000000053f128 0013f128
0000000000000018 0000000000000000 AX 0 0 4
[11] .plt PROGBITS 000000000053f140 0013f140
0000000000001ba0 0000000000000010 AX 0 0 4
[12] .text PROGBITS 0000000000540ce0 00140ce0
0000000000136368 0000000000000000 AX 0 0 16
[13] .fini PROGBITS 0000000000677048 00277048
000000000000000e 0000000000000000 AX 0 0 4
[14] .rodata PROGBITS 0000000000677080 00277080
0000000000024480 0000000000000000 A 0 0 64
[15] .eh_frame_hdr PROGBITS 000000000069b500 0029b500
00000000000111ec 0000000000000000 A 0 0 4
[16] .eh_frame PROGBITS 00000000006ac6f0 002ac6f0
000000000005058c 0000000000000000 A 0 0 8
[17] .gcc_except_table PROGBITS 00000000006fcc7c 002fcc7c
000000000000a850 0000000000000000 A 0 0 4
[18] .tdata PROGBITS 00000000009074d0 003074d0
0000000000000004 0000000000000000 WAT 0 0 8
[19] .tbss NOBITS 00000000009074d8 003074d4
000000000001b4d8 0000000000000000 WAT 0 0 8
[20] .preinit_array PREINIT_ARRAY 00000000009074d8 003074d8
0000000000000008 0000000000000000 WA 0 0 8
[21] .ctors PROGBITS 00000000009074e0 003074e0
0000000000000158 0000000000000000 WA 0 0 8
[22] .dtors PROGBITS 0000000000907638 00307638
0000000000000010 0000000000000000 WA 0 0 8
[23] .jcr PROGBITS 0000000000907648 00307648
0000000000000008 0000000000000000 WA 0 0 8
[24] .data.rel.ro PROGBITS 0000000000907680 00307680
0000000000004990 0000000000000000 WA 0 0 64
[25] .dynamic DYNAMIC 000000000090c010 0030c010
0000000000000240 0000000000000010 WA 5 0 8
[26] .got PROGBITS 000000000090c250 0030c250
0000000000000310 0000000000000008 WA 0 0 8
[27] .got.plt PROGBITS 000000000090c560 0030c560
0000000000000de0 0000000000000008 WA 0 0 8
[28] .data PROGBITS 000000000090d340 0030d340
0000000000000fe0 0000000000000000 WA 0 0 64
[29] .bss NOBITS 000000000090e340 0030e320
0000000000c18a38 0000000000000000 WA 0 0 64
[30] .comment PROGBITS 0000000000000000 0030e320
000000000000003e 0000000000000001 MS 0 0 1
[31] .debug_aranges PROGBITS 0000000000000000 0030e35e
00000000000200b0 0000000000000000 0 0 1
[32] .debug_info PROGBITS 0000000000000000 0032e40e
000000000033aded 0000000000000000 0 0 1
[33] .debug_abbrev PROGBITS 0000000000000000 006691fb
00000000000296ae 0000000000000000 0 0 1
[34] .debug_line PROGBITS 0000000000000000 006928a9
0000000000068038 0000000000000000 0 0 1
[35] .debug_str PROGBITS 0000000000000000 006fa8e1
00000000001afb89 0000000000000001 MS 0 0 1
[36] .debug_loc PROGBITS 0000000000000000 008aa46a
000000000010b830 0000000000000000 0 0 1
[37] .debug_ranges PROGBITS 0000000000000000 009b5c9a
0000000000055d70 0000000000000000 0 0 1
[38] .shstrtab STRTAB 0000000000000000 00a0ba0a
000000000000017b 0000000000000000 0 0 1
[39] .symtab SYMTAB 0000000000000000 00a0c5c8
00000000000562f8 0000000000000018 40 3277 8
[40] .strtab STRTAB 0000000000000000 00a628c0
00000000000fa11b 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
And without -g option, release version created, here's readelf -S release outputs:
There are 39 section headers, starting at offset 0x3290b8:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
0000000000008558 0000000000000004 A 4 0 8
[ 4] .dynsym DYNSYM 00000000004087d0 000087d0
0000000000019f98 0000000000000018 A 5 1 8
[ 5] .dynstr STRTAB 0000000000422768 00022768
000000000003d80b 0000000000000000 A 0 0 1
[ 6] .gnu.version VERSYM 000000000045ff74 0005ff74
00000000000022a2 0000000000000002 A 4 0 2
[ 7] .gnu.version_r VERNEED 0000000000462218 00062218
0000000000000200 0000000000000000 A 5 8 8
[ 8] .rela.dyn RELA 0000000000462418 00062418
0000000000000840 0000000000000018 A 4 0 8
[ 9] .rela.plt RELA 0000000000462c58 00062c58
00000000000020e8 0000000000000018 A 4 11 8
[10] .init PROGBITS 0000000000464d40 00064d40
0000000000000018 0000000000000000 AX 0 0 4
[11] .plt PROGBITS 0000000000464d58 00064d58
0000000000001600 0000000000000010 AX 0 0 4
[12] .text PROGBITS 0000000000466360 00066360
00000000000e6a28 0000000000000000 AX 0 0 16
[13] .fini PROGBITS 000000000054cd88 0014cd88
000000000000000e 0000000000000000 AX 0 0 4
[14] .rodata PROGBITS 000000000054cdc0 0014cdc0
000000000001d3f0 0000000000000000 A 0 0 64
[15] .eh_frame_hdr PROGBITS 000000000056a1b0 0016a1b0
00000000000068e4 0000000000000000 A 0 0 4
[16] .eh_frame PROGBITS 0000000000570a98 00170a98
0000000000025e7c 0000000000000000 A 0 0 8
[17] .gcc_except_table PROGBITS 0000000000596914 00196914
0000000000009914 0000000000000000 A 0 0 4
[18] .tbss NOBITS 00000000007a0228 001a0228
0000000000000950 0000000000000000 WAT 0 0 8
[19] .ctors PROGBITS 00000000007a0228 001a0228
0000000000000130 0000000000000000 WA 0 0 8
[20] .dtors PROGBITS 00000000007a0358 001a0358
0000000000000010 0000000000000000 WA 0 0 8
[21] .jcr PROGBITS 00000000007a0368 001a0368
0000000000000008 0000000000000000 WA 0 0 8
[22] .data.rel.ro PROGBITS 00000000007a0380 001a0380
0000000000003bd0 0000000000000000 WA 0 0 64
[23] .dynamic DYNAMIC 00000000007a3f50 001a3f50
0000000000000210 0000000000000010 WA 5 0 8
[24] .got PROGBITS 00000000007a4160 001a4160
0000000000000158 0000000000000008 WA 0 0 8
[25] .got.plt PROGBITS 00000000007a42b8 001a42b8
0000000000000b10 0000000000000008 WA 0 0 8
[26] .data PROGBITS 00000000007a4e00 001a4e00
00000000000007c0 0000000000000000 WA 0 0 64
[27] .bss NOBITS 00000000007a55c0 001a55c0
0000000000002038 0000000000000000 WA 0 0 64
[28] .comment PROGBITS 0000000000000000 001a55c0
000000000000003e 0000000000000001 MS 0 0 1
[29] .debug_aranges PROGBITS 0000000000000000 001a55fe
0000000000000e10 0000000000000000 0 0 1
[30] .debug_info PROGBITS 0000000000000000 001a640e
00000000000a1d76 0000000000000000 0 0 1
[31] .debug_abbrev PROGBITS 0000000000000000 00248184
000000000000b09d 0000000000000000 0 0 1
[32] .debug_line PROGBITS 0000000000000000 00253221
00000000000113c8 0000000000000000 0 0 1
[33] .debug_str PROGBITS 0000000000000000 002645e9
000000000001731a 0000000000000001 MS 0 0 1
[34] .debug_loc PROGBITS 0000000000000000 0027b903
00000000000923ad 0000000000000000 0 0 1
[35] .debug_ranges PROGBITS 0000000000000000 0030dcb0
000000000001b2a0 0000000000000000 0 0 1
[36] .shstrtab STRTAB 0000000000000000 00328f50
0000000000000165 0000000000000000 0 0 1
[37] .symtab SYMTAB 0000000000000000 00329a78
0000000000021048 0000000000000018 38 1203 8
[38] .strtab STRTAB 0000000000000000 0034aac0
000000000004b633 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
The two condition differs in the number of section headers. It seems that i can't distinguish the two version with this command. Any other solutions ?
If you can do a rebuild, try adding LOCALVERSION=build_release or LOCALVERSION=build_debug to the make command line for release and debug builds respectively. You should then be able to find these strings with:
strings <kernel image> | fgrep build_
You might need to make sure CONFIG_LOCALVERSION is not defined in your .config file.
It can be hard to know what the build intention was by looking at the produced image, unless some string has deliberately been put there. Which is what I tried to accomplish above.
readelf -S <image name> | grep debug
if image is built in debug, it will output something like: enter image description here
otherwise it is built in release.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With