gdb disassemble/rs
, kaynak ve ham baytları da göstermek için
Bu formatla objdump -S
çıktıya gerçekten çok yaklaşıyor :
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
main.c
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
Derleyin ve sökün
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
Demontaj:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
Ubuntu 16.04, GDB 7.11.1'de test edilmiştir.
objdump + awk geçici çözümleri
Paragrafı şu adreste belirtildiği gibi yazdırın: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -Metin
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
Örneğin:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
sadece şunu verir:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
Kullanırken -S
çok kodun yorumlar olası diziyi içerebilir gibi tedbirli bir yol yoktur sanmıyorum ... Ama şu neredeyse her zaman çalışır:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
şundan uyarlanmıştır: awk / sed ile birden çok kez ortaya çıkabilen iki işaret modeli arasındaki çizgiler nasıl seçilir
Posta listesi yanıtları
Posta listesinde bunun mümkün olmadığını söyleyen bir 2010 dizisi var: https://sourceware.org/ml/binutils/2010-04/msg00445.html
gdb
Tom tarafından önerilen geçici çözümün yanı sıra, -ffunction-section
bölüm başına bir işlev koyan ve ardından bölümü atan başka bir (daha kötü) geçici çözüm hakkında da yorum yapıyorlar .
Nicolas Clifton buna bir WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html verdi , çünkü GDB geçici çözümü bu kullanım durumunu kapsıyor.
static
, derleyici tarafından çağrı sitelerine satır içi olabilir. Bu, aslında sökülmesi gereken herhangi bir işlevin kendiliğinden olmayabileceği anlamına gelebilir . Diğer işlevler için sembolleri tespit edebiliyor, ancak aradığınız işlevi göremiyorsanız, bu, işlevin satır içi olduğuna dair güçlü bir ipucudur. ELF dosyası hata ayıklama bilgisi, talimatlar başka bir yere taşınsa bile, her bir talimatın nereden kaynaklandığını saklar.