Πώς θα αποκτήσετε εξόδου συναρμολόγησης από C / C ++ πηγή στο gcc;

ψήφοι
283

Πώς μπορεί κάποιος να το κάνετε αυτό;

Αν θέλω να αναλύσουμε το πώς κάτι γίνεται όλο και καταρτίζονται, πώς θα πάρω το εκπεμπόμενο κώδικα συγκρότημα;

Δημοσιεύθηκε 25/09/2008 στις 23:10
χρήστη
Σε άλλες γλώσσες...                            


17 απαντήσεις

ψήφοι
20

Χρησιμοποιήστε το διακόπτη -S

g++ -S main.cpp

ή και με gcc

gcc -S main.c

Επίσης δείτε αυτό το

Απαντήθηκε 25/09/2008 στις 23:11
πηγή χρήστη

ψήφοι
6

Χρησιμοποιήστε την επιλογή-s:

gcc -S program.c
Απαντήθηκε 25/09/2008 στις 23:11
πηγή χρήστη

ψήφοι
12

Αν αυτό που θέλουν να δουν εξαρτάται από τη σύνδεση της εξόδου, τότε objdump στο αρχείο αντικειμένου εξόδου / εκτελέσιμο μπορεί επίσης να είναι χρήσιμο εκτός από την προαναφερθείσα gcc -S. Εδώ είναι ένα πολύ χρήσιμο σενάριο από Loren Merritt που μετατρέπει την προεπιλεγμένη σύνταξη objdump στην πιο ευανάγνωστο σύνταξη nasm:

#!/usr/bin/perl -w
$ptr='(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR ';
$reg='(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])';
open FH, '-|', '/usr/bin/objdump', '-w', '-M', 'intel', @ARGV or die;
$prev = "";
while(<FH>){
    if(/$ptr/o) {
        s/$ptr(\[[^\[\]]+\],$reg)/$2/o or
        s/($reg,)$ptr(\[[^\[\]]+\])/$1$3/o or
        s/$ptr/lc $1/oe;
    }
    if($prev =~ /\t(repz )?ret / and
       $_ =~ /\tnop |\txchg *ax,ax$/) {
       # drop this line
    } else {
       print $prev;
       $prev = $_;
    }
}
print $prev;
close FH;

Υποψιάζομαι ότι αυτό μπορεί επίσης να χρησιμοποιηθεί για την παραγωγή του gcc -S.

Απαντήθηκε 25/09/2008 στις 23:14
πηγή χρήστη

ψήφοι
325

Χρησιμοποιήστε την -Sεπιλογή για να GCC (ή g ++).

gcc -S helloworld.c

Αυτό θα τρέξει το προεπεξεργαστή (CPP) πάνω helloworld.c, πραγματοποιεί την αρχική κατάρτιση και στη συνέχεια να σταματήσει πριν από το συναρμολόγησης λειτουργεί.

Εξ ορισμού αυτό θα αποδώσει ένα αρχείο helloworld.s. Το αρχείο εξόδου μπορεί να εξακολουθεί να ρυθμιστεί χρησιμοποιώντας την -oεπιλογή.

gcc -S -o my_asm_output.s helloworld.c

Φυσικά, αυτό λειτουργεί μόνο αν έχετε την αρχική πηγή. Μια εναλλακτική λύση, αν έχετε μόνο το προκύπτον αρχείο στόχος είναι να χρησιμοποιήσει objdump, ορίζοντας την --disassembleεπιλογή (ή -dγια τη συντετμημένη μορφή).

objdump -S --disassemble helloworld > helloworld.dump

Αυτή η επιλογή λειτουργεί καλύτερα εάν η επιλογή εντοπισμού σφαλμάτων είναι ενεργοποιημένη για το αρχείο αντικειμένου ( -gκατά το χρόνο μεταγλώττισης) και το αρχείο δεν έχει αφαιρεθεί.

Τρέξιμο file helloworldθα σας δώσει κάποια ένδειξη ως προς το επίπεδο λεπτομέρειας που θα πάρετε από τη χρήση objdump.

Απαντήθηκε 25/09/2008 στις 23:19
πηγή χρήστη

ψήφοι
7

Όπως ο καθένας έχει επισημάνει, χρησιμοποιήστε την -Sεπιλογή για να GCC. Θα ήθελα επίσης να προσθέσω ότι τα αποτελέσματα μπορεί να διαφέρουν (άγρια!) Ανάλογα με το αν ή όχι θα προσθέσετε επιλογές βελτιστοποίησης ( -O0για κανένα, -O2για τη βελτιστοποίηση επιθετική).

Σε RISC αρχιτεκτονικές, ιδίως, ο compiler θα μετατρέψει συχνά τον κωδικό σχεδόν πέρα ​​από την αναγνώριση σε κάνει βελτιστοποίησης. Είναι εντυπωσιακό και συναρπαστικό να δούμε τα αποτελέσματα!

Απαντήθηκε 26/09/2008 στις 01:06
πηγή χρήστη

ψήφοι
146

Αυτό θα δημιουργήσει την ASM με τις κώδικα C + γραμμή αριθμούς παρεμβαλλόταν να δούμε πιο εύκολα τι γραμμές παράγουν τι κώδικα.

# create assembler code:
c++ -S -fverbose-asm -g -O2 test.cc -o test.s
# create asm interlaced with source lines:
as -alhnd test.s > test.lst

Βρέθηκαν σε Αλγόριθμοι για τους προγραμματιστές , σελίδα 4.

Απαντήθηκε 26/09/2008 στις 01:51
πηγή χρήστη

ψήφοι
6

Όπως αναφέρθηκε προηγουμένως, να δούμε την -S σημαία.

Αξίζει επίσης να εξετάζει την οικογένεια «-fdump-δέντρο» των σημαιών, ιδίως «-fdump-δέντρο-όλα», η οποία σας επιτρέπει να δείτε μερικές από τις ενδιάμεσες μορφές ΣΣΚ. Αυτά μπορεί συχνά να είναι πιο ευανάγνωστο από ό, τι συναρμολόγησης (τουλάχιστον για μένα), και σας επιτρέπουν να δείτε πώς εκτελούν περάσματα βελτιστοποίησης.

Απαντήθηκε 11/10/2008 στις 15:31
πηγή χρήστη

ψήφοι
1

Χρησιμοποιήστε «-S» ως επιλογή. Εμφανίζει την έξοδο συγκρότημα στο τερματικό.

Απαντήθηκε 16/12/2010 στις 01:18
πηγή χρήστη

ψήφοι
4

Από: http://www.delorie.com/djgpp/v2faq/faq8_20.html

gcc -c -g -ΛΥα, -a, -ad [άλλες επιλογές του ΣΣΚ] foo.c> foo.lst

στην εναλλακτική λύση για την απάντηση PhirePhly Ή απλά χρησιμοποιήστε το -S όπως ο καθένας είπε.

Απαντήθηκε 04/01/2011 στις 11:02
πηγή χρήστη

ψήφοι
6

Αν ψάχνετε για συναρμολόγηση LLVM:

llvm-gcc -emit-llvm -S hello.c
Απαντήθηκε 24/10/2011 στις 05:18
πηγή χρήστη

ψήφοι
7

Λοιπόν, όπως όλοι είπαν, χρησιμοποιήστε -S επιλογή. Αν χρησιμοποιήσετε την επιλογή-Save-temps, μπορείτε επίσης να πάρετε προεπεξεργασμένα αρχείο ( .i), το αρχείο συναρμολόγησης ( .s) και το αρχείο αντικειμένου (*. Ιε). (πάρει το καθένα από αυτά με τη χρήση -Ε, -S, και -γ.)

Απαντήθηκε 13/06/2013 στις 07:56
πηγή χρήστη

ψήφοι
41

Η ακόλουθη γραμμή εντολών είναι από το blog χριστιανική Garbin του

g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt

Έτρεξα G ++ από ένα παράθυρο DOS στα Windows-XP, ενάντια σε μια ρουτίνα που περιλαμβάνει μια σιωπηρή καστ

c:\gpp_code>g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
horton_ex2_05.cpp: In function `int main()':
horton_ex2_05.cpp:92: warning: assignment to `int' from `double'

Η έξοδος είναι asssembled παραγόμενο κώδικα iterspersed με τον αρχικό κώδικα C ++ (ο κώδικας C ++ εμφανίζεται ως παρατηρήσεις στο παραγόμενο ρεύμα ASM)

  16:horton_ex2_05.cpp **** using std::setw;
  17:horton_ex2_05.cpp ****
  18:horton_ex2_05.cpp **** void disp_Time_Line (void);
  19:horton_ex2_05.cpp ****
  20:horton_ex2_05.cpp **** int main(void)
  21:horton_ex2_05.cpp **** {
 164                    %ebp
 165                            subl $128,%esp
?GAS LISTING C:\DOCUME~1\CRAIGM~1\LOCALS~1\Temp\ccx52rCc.s
166 0128 55                    call ___main
167 0129 89E5          .stabn 68,0,21,LM2-_main
168 012b 81EC8000      LM2:
168      0000
169 0131 E8000000      LBB2:
169      00
170                    .stabn 68,0,25,LM3-_main
171                    LM3:
172                            movl $0,-16(%ebp)
Απαντήθηκε 29/09/2013 στις 21:07
πηγή χρήστη

ψήφοι
3

Δεν βλέπω αυτή τη δυνατότητα, μεταξύ απαντήσεις, πιθανώς επειδή το θέμα είναι από το 2008, αλλά το 2018, μπορείτε να χρησιμοποιήσετε την online ιστοσελίδα Matt Goldbolt του https://godbolt.org

Μπορείτε επίσης τοπικά git κλώνο και να τρέξει το έργο του https://github.com/mattgodbolt/compiler-explorer

Απαντήθηκε 24/01/2018 στις 13:27
πηγή χρήστη

ψήφοι
1

Έξοδος από αυτές τις commnads

Εδώ είναι τα βήματα για να δείτε / τυπώσετε τον κωδικό συναρμολόγηση κάθε πρόγραμμα C για τα Windows σας

προτροπή / τερματικό / κονσόλα την εντολή:

  1. Γράψτε ένα πρόγραμμα C σε C κώδικα πρόγραμμα επεξεργασίας, όπως codeblocks και να το αποθηκεύσετε με επέκταση .c

  2. Συντάξτε και εκτελέστε το.

  3. Μόλις εκτελεστεί με επιτυχία, μεταβείτε στο φάκελο όπου έχετε εγκαταστήσει gcc compiler σας και να δώσει το

    ακόλουθη εντολή για να πάρετε ένα αρχείο «.s» της «.c» αρχείο

    C: \ gcc> gcc -S πλήρη διαδρομή του αρχείου C ENTER

    Ένα παράδειγμα εντολής (όπως στη δική μου περίπτωση)

    C: \ gcc> gcc -SD: \ Aa_C_Certified \ alternate_letters.c

    Αυτό παράγει ένα αρχείο «.s» του αρχικού «.c» αρχείο

4. Μετά από αυτό, πληκτρολογήστε την ακόλουθη εντολή

Γ? \ Gcc> cpp filename.s ENTER

εντολή Παράδειγμα (όπως στην περίπτωσή μου)

Γ? \ Gcc> cpp alternate_letters.s

Αυτό θα εκτυπώσει / εξόδου ολόκληρο τον κώδικα γλώσσας Συνέλευση του προγράμματός σας C.

Απαντήθηκε 25/02/2018 στις 01:03
πηγή χρήστη

ψήφοι
1

Πρόσφατα θέλησα να μάθω το συγκρότημα του κάθε λειτουργιών σε ένα πρόγραμμα
αυτό είναι το πώς το έκανα.

$ gcc main.c                      // main.c source file
$ gdb a.exe                       // gdb a.out in linux
  (gdb) disass main               // note here main is a function
                                  // similary it can be done for other functions
Απαντήθηκε 28/11/2018 στις 04:13
πηγή χρήστη

ψήφοι
0

Εδώ είναι μια λύση για το C χρησιμοποιώντας gcc:

gcc -S program.c && gcc program.c -o output
  1. Εδώ το πρώτο μέρος καταστημάτων την έξοδο συνέλευση του προγράμματος με το ίδιο όνομα αρχείου ως πρόγραμμα αλλά με αλλαγμένο .s επέκταση, μπορείτε να το ανοίξετε, όπως κάθε κανονικό αρχείο κειμένου.

  2. Το δεύτερο μέρος εδώ συγκεντρώνει το πρόγραμμά σας για την πραγματική χρήση και δημιουργεί ένα εκτελέσιμο για το πρόγραμμα σας με ένα συγκεκριμένο όνομα αρχείου.

Η program.c που χρησιμοποιείται παραπάνω είναι το όνομα του προγράμματός σας και εξόδου είναι το όνομα του εκτελέσιμου που θέλετε να δημιουργήσετε.

BTW Είναι το πρώτο μου post στο StackOverflow: -}

Απαντήθηκε 26/12/2018 στις 02:28
πηγή χρήστη

ψήφοι
1

-save-temps

Αυτό αναφέρθηκε σε https://stackoverflow.com/a/17083009/895245 , αλλά επιτρέψτε μου να εξηγούν περαιτέρω. Όταν το κάνετε:

gcc -save-temps -c -o main.o main.c

main.c

#define INC 1

int myfunc(int i) {
    return i + INC;
}

και τώρα, εκτός από την κανονική έξοδο main.o, ο τρέχων κατάλογος εργασίας περιέχει επίσης τα ακόλουθα αρχεία:

  • main.i είναι ένα μπόνους και περιέχει είναι το επιθυμητό prepossessed αρχείο:

    # 1 "main.c"
    # 1 "<built-in>"
    # 1 "<command-line>"
    # 31 "<command-line>"
    # 1 "/usr/include/stdc-predef.h" 1 3 4
    # 32 "<command-line>" 2
    # 1 "main.c"
    
    
    int myfunc(int i) {
        return i + 1;
    }
    
  • main.s περιέχει το επιθυμητό δημιουργείται συναρμολόγησης:

        .file   "main.c"
        .text
        .globl  myfunc
        .type   myfunc, @function
    myfunc:
    .LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        addl    $1, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
    .LFE0:
        .size   myfunc, .-myfunc
        .ident  "GCC: (Ubuntu 8.3.0-6ubuntu1) 8.3.0"
        .section    .note.GNU-stack,"",@progbits
    

Αν θέλετε να το κάνετε για ένα μεγάλο αριθμό αρχείων, μπορείτε να χρησιμοποιήσετε αντί για:

 -save-temps=obj

το οποίο αποθηκεύει τα ενδιάμεσα αρχεία στον ίδιο κατάλογο με το -oέξοδο αντικείμενο αντί του τρέχοντος καταλόγου εργασίας, αποφεύγοντας έτσι πιθανές συγκρούσεις basename.

Το πλεονέκτημα αυτής της επιλογής πάνω -Sείναι ότι είναι εύκολο να το προσθέσετε σε οποιοδήποτε σενάριο κατασκευής, χωρίς να παρεμβαίνει πολύ στην ίδια την κατασκευή.

Ένα άλλο δροσερό πράγμα για αυτήν την επιλογή είναι αν προσθέσετε -v:

gcc -save-temps -c -o main.o -v main.c

στην πραγματικότητα δείχνει τα σαφή αρχεία που χρησιμοποιούνται αντί άσχημο προσωρινές αποκαταστάσεις κάτω /tmp, έτσι ώστε να είναι εύκολο να γνωρίζουμε ακριβώς τι συμβαίνει, η οποία περιλαμβάνει τα στάδια προεπεξεργασίας / κατάρτιση / συναρμολόγησης:

/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu main.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector-strong -Wformat -Wformat-security -o main.i
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -fpreprocessed main.i -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase-strip main.o -version -fstack-protector-strong -Wformat -Wformat-security -o main.s
as -v --64 -o main.o main.s

Δοκιμασμένο στο Ubuntu 19.04 amd64, GCC 8.3.0.

Απαντήθηκε 28/06/2019 στις 08:28
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more