العثور على المواقع بلغة الآلة (دول مجلس التعاون الخليجي / objdump -d)

StackOverflow https://stackoverflow.com/questions/282899

  •  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) يتم مباشرة بعد حاسوب الرئيسي، يمكن الوصول الرئيسية التي فار. إن لم يكن هو الخاص لشريط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top