العثور على المواقع بلغة الآلة (دول مجلس التعاون الخليجي / objdump -d)
-
08-07-2019 - |
سؤال
إذا كان لديك خط معين من التعليمات البرمجية C في الاعتبار لفحص في إخراج آلة، كيف تحديد موقعه في الناتج objdump. هنا مثال
if (cond)
foo;
bar();
ووأريد أن أرى إذا كان inlined الشريط كما أود. أو يمكنك استخدام بعض الأدوات البديلة بدلا من objdump؟
المحلول
ويمكنك البدء objdump باستخدام الخيار -S
(مثل "objdump -Sd a.out"
). فإنه سيتم عرض المصدرية intermixxed مع رمز المجمع، إذا هي ملفات المصدر ان ترجمة التعليمات البرمجية من المتاحة.
وبدلا من ذلك، يمكنك استخدام الطريقة التالية:
int main(void) {
int a = 0;
asm("#");
return a;
}
ويصبح
.file "a.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $0, -8(%ebp)
#APP
# 3 "a.c" 1
#
# 0 "" 2
#NO_APP
movl -8(%ebp), %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.3.2"
.section .note.GNU-stack,"",@progbits
نصائح أخرى
ويجب أن المصحح أيضا تمكنك من رؤية شفرة المصدر والتجمع مطابقة إذا جمعت مع رموز التصحيح. هذا هو الخيار -g دول مجلس التعاون الخليجي وdisass جدب الأوامر.
إذا كنت ترجمة مع دول مجلس التعاون الخليجي، يمكنك استخدام -S لإنشاء ملف التجميع مباشرة. هذا الملف عادة لديه بعض المعلومات المفيدة في ذلك، بما في ذلك الأسماء وظيفة وأحيانا أرقام الأسطر لرمز (اعتمادا على خيارات الترجمة التي تستخدم).
والمكالمات وظيفة في الجمعية من قبل حاسوب وظيفة المشترك.
ومع I386 هو
55 push %ebp
89 e5 mov %esp, %ebp
...
c9 leave # optional
c3 ret
ومع AMD64 / x86_64 هو مشابه (فقط 48
رباعية اختصار):
55 push %rbp
48 89 e5 mov %rsp,%rbp
..
c9 leaveq # optional
c3 retq
وحتى عندما كشف عن أن داخل objdump -S bla.o
الخاص بك
أو
الناتج gcc bla.c -g -fsave-temps -fverbose-asm
من المهمة الرئيسية الخاصة بك
ولشريط أيضا، لا inlined بار. أيضا عندما يكون الرئيسية مكالمة أو القفز
لمنع لا inlined ذلك.
في قضيتك هل يمكن معرفة ما إذا كان شريط له فار المحلية، التي تحتاج إلى الغرفة
كومة المحلي. إذا تم inlined شريط مكدس ضبط (على سبيل المثال sub $0x8,%esp
)
يتم مباشرة بعد حاسوب الرئيسي، يمكن الوصول الرئيسية التي فار.
إن لم يكن هو الخاص لشريط.