পঠনযোগ্য সমাবেশ উত্পাদন করতে জিসিসি ব্যবহার করছেন?


256

আমি ভাবছিলাম যে কীভাবে আমার সি উত্স ফাইলটিতে জিসিসি ব্যবহার করতে হবে মেশিন কোডটির একটি স্মৃতি সংস্করণ ডাম্প করার জন্য যাতে আমি দেখতে পারি যে আমার কোডটি কী সংকলিত হচ্ছে। আপনি জাভা দিয়ে এটি করতে পারেন তবে আমি জিসিসির সাথে কোনও উপায় খুঁজে পাচ্ছি না।

আমি সমাবেশে একটি সি পদ্ধতি পুনরায় লেখার চেষ্টা করছি এবং জিসিসি এটি কীভাবে সাহায্য করবে তা বড় সাহায্য হবে seeing


25
নোট করুন যে 'বাইটকোড' বলতে সাধারণত ভিভিএম দ্বারা ব্যবহার করা কোড বোঝায়, যেমন জেভিএম বা। নেট এর সিএলআর। জিসিসির আউটপুটটিকে আরও ভালভাবে 'মেশিন কোড', 'মেশিন ল্যাঙ্গুয়েজ' বা 'সমাবেশ ভাষা' বলা যায়
জাভিয়ের

2
আমি গডবোল্ট ব্যবহার করে একটি উত্তর যুক্ত করেছি যেহেতু এটি দ্রুতভাবে পরীক্ষা করার জন্য একটি অত্যন্ত শক্তিশালী সরঞ্জাম যা বিভিন্ন বিকল্পগুলি আপনার কোড প্রজন্মকে কীভাবে প্রভাবিত করে।
শফিক ইয়াঘমোর



Asm আউটপুটটিকে মানব পাঠযোগ্য করে তোলার আরও টিপসের জন্য, আরও দেখুন: কীভাবে জিসিসি / ঝনঝন সমাবেশ আউটপুট থেকে "শব্দ" সরিয়ে ফেলা যায়?
পিটার কর্ডস

উত্তর:


335

আপনি যদি ডিবাগ প্রতীকগুলি সংকলন করেন তবে আপনি objdumpআরও পঠনযোগ্য বিচ্ছিন্নতা উত্পাদন করতে ব্যবহার করতে পারেন ।

>objdump --help
[...]
-S, --source             Intermix source code with disassembly
-l, --line-numbers       Include line numbers and filenames in output

objdump -drwC -Mintel সুন্দর:

  • -rrelocations উপর শো প্রতীক নাম (আপনি দেখতে না তাই putscallনিচের নির্দেশনা)
  • -R গতিশীল-সংযুক্ত স্থানান্তর / প্রতীক নামগুলি (ভাগ করা লাইব্রেরিতে দরকারী) দেখায়
  • -C সি ++ চিহ্নের নামগুলি ডিমেনলেস করে
  • -w এটি "প্রশস্ত" মোড: এটি মেশিন-কোড বাইটগুলি লাইন করে না
  • -Mintel: .intel_syntax noprefixএটিএন্ডটিটির পরিবর্তে জিএএস / বাইনুটিস এমএএসএম-জাতীয় সিনট্যাক্স ব্যবহার করুন
  • -S: বিচ্ছিন্ন সঙ্গে আন্তঃবাহ উত্স লাইন।

আপনি ভালো কিছু করা হতে পারে alias disas="objdump -drwCS -Mintel"আপনার~/.bashrc


উদাহরণ:

> gcc -g -c test.c
> objdump -d -M intel -S test.o

test.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
#include <stdio.h>

int main(void)
{
   0:   55                      push   ebp
   1:   89 e5                   mov    ebp,esp
   3:   83 e4 f0                and    esp,0xfffffff0
   6:   83 ec 10                sub    esp,0x10
    puts("test");
   9:   c7 04 24 00 00 00 00    mov    DWORD PTR [esp],0x0
  10:   e8 fc ff ff ff          call   11 <main+0x11>

    return 0;
  15:   b8 00 00 00 00          mov    eax,0x0
}
  1a:   c9                      leave  
  1b:   c3                      ret

3
কেবলমাত্র ইন্টেল নির্দেশাবলী গ্রহন করার জন্য কি কোনও পরিবর্তন আছে?
জেমস

3
এগুলি সমস্ত ইন্টেল নির্দেশাবলী যেহেতু তারা ইন্টেল প্রসেসরগুলিতে চালিত হয়: ডি।
Toto

12
@ টোটো আমার মনে হয় তিনি এটিএন্ডটি সিনট্যাক্সের পরিবর্তে ইন্টেল সিনট্যাক্সের অর্থ করেছেন
আমোক

7
স্যুইচ ক্রমটি ব্যবহার করে মধ্যবর্তী অবজেক্ট ফাইলটি রেখে যাওয়া সম্ভব -Wa,-adhln -g to gcc। এটি ধরে নিয়েছে যে এসেম্বলার হ'ল গ্যাস এবং এটি সর্বদা ক্ষেত্রে নাও হতে পারে।
মার্ক বাটলার

8
@James হ্যাঁ, সরবরাহ -Mintel
ফুজ

106

আপনি যদি জিসিসি পতাকা দেন তবে -fverbose-asmতা হবে

এটিকে আরও পাঠযোগ্য করে তোলার জন্য উত্পন্ন সমাবেশ কোডে অতিরিক্ত ভাষ্য সম্পর্কিত তথ্য রাখুন।

[...] যোগ করা মন্তব্যের মধ্যে রয়েছে:

  • সংকলক সংস্করণ এবং কমান্ড-লাইন বিকল্পগুলির তথ্য,
  • FILENAME আকারে সমাবেশের নির্দেশাবলীর সাথে উত্স কোডের লাইনগুলি: লিনেনদার: লাইন অবধি,
  • যে ইঙ্গিতগুলি নিয়ে উচ্চ-স্তরের অভিব্যক্তি বিভিন্ন সমাবেশ নির্দেশিকাটির অপারেশনগুলির সাথে মিলে যায়।

কিন্তু তারপর, আমি জন্য ব্যবহৃত সুইচ হারিয়ে যাবে objdump- objdump -drwCS -Mintel, তাই আমি ভালো কিছু ব্যবহার করতে পারেন verboseসঙ্গে objdump? যাতে আমি asm কোডে মতামত রাখতে পারি, যেমনটি -fverbose-asmজিসিসিতে থাকে?
হার্ডসম্যান

1
@ হার্ডসম্যান: আপনি পারবেন না। অতিরিক্ত জিনিস -fverbose-asmযুক্ত করা হয় আউটপুট এর asm বাক্য বিন্যাসে মন্তব্য আকারে, নির্দেশনা নয় যে .oফাইলটিতে অতিরিক্ত কিছু দেবে । এটি সমস্ত একত্রিত সময়ে বাতিল করা হয়। সংস্থানকারী পরিবর্তে সংকলক asm আউটপুট দেখুন , যেমন Godbolt.org এ যেখানে আপনি সহজেই এটি উত্স লাইনটির সাথে মাউসওভারের মাধ্যমে এবং সংশ্লিষ্ট উত্স / asm লাইনের বর্ণ হাইলাইটিংয়ের সাথে মিলিয়ে নিতে পারেন। জিসিসি / ঝনঝন বিধানসভা আউটপুট থেকে কীভাবে "শব্দ" সরিয়ে ফেলবেন?
পিটার কর্ডেস

75

জিসিসি-তে (নোট: মূলধন এস) স্যুইচ করুন এবং এটি এস। এক্সটেনশন সহ একটি ফাইলের মধ্যে অ্যাসেম্বলি কোডটি নির্গত করবে। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ড:

gcc -O2 -S foo.c

উত্পন্ন সমাবেশ কোডটি foo.s ফাইলটিতে ছেড়ে যাবে

Http://www.delorie.com/djgpp/v2faq/faq8_20.html থেকে সরাসরি ছিঁড়ে গেছে (তবে ভুল সরানো -c)


35
আপনার -c এবং-এস মিশ্রিত করা উচিত নয়, কেবল তাদের মধ্যে একটি ব্যবহার করুন। এক্ষেত্রে, একজন অন্যজনকে অগ্রাহ্য করছে, সম্ভবত তারা যে ক্রমে ব্যবহৃত হচ্ছে তার উপর নির্ভর করে।
অ্যাডাম রোজেনফিল্ড

4
@ অ্যাডামরোসনফিল্ড 'সি-সি এবং এস মিশ্রিত হওয়া উচিত না? যদি এটি সত্য হয় তবে আমাদের লেখককে স্মরণ করিয়ে দেওয়া এবং এটি সম্পাদনা করা উচিত।
টনি

5
@ টনি: gcc.gnu.org/onlinesocs/gcc/Overall-Options.html# সামগ্রিক- অধ্যায়গুলি "আপনি জিসিসি কোথায় থামাতে হবে তা বলতে -C , -S, বা -E বিকল্পগুলির মধ্যে একটি ব্যবহার করতে পারেন । "
নাট এল্ডারেজ

1
আপনি যদি মধ্যবর্তী সমস্ত আউটপুট চান তবে ব্যবহার করুন gcc -march=native -O3 -save-temps। আপনি -cলিংকের চেষ্টা না করে বা যা-ই হোক না কেন অবজেক্ট-ফাইল তৈরি বন্ধ করতে ব্যবহার করতে পারেন ।
পিটার কর্ডেস

2
-save-tempsআকর্ষণীয় যেহেতু এটি একটিকে ডাম্প করে দেয় সঠিক কোড উত্পন্ন কোড, অন্যদিকে বিকল্পটির সাথে সংকলকটি কল করার -Sঅর্থ দুটিবার সংকলন করা, এবং সম্ভবত বিভিন্ন বিকল্পের সাথে option কিন্তু -save-temps সমস্ত বর্তমান ডিরেক্টরিতে ডাম্পস, যা এক ধরণের অগোছালো। দেখে মনে হচ্ছে এটি আপনার কোডটি পরিদর্শন করার কোনও সরঞ্জামের চেয়ে জিসিসির পক্ষে একটি ডিবাগ বিকল্প হিসাবে বেশি লক্ষ্যযুক্ত।
স্টাফেন গ্যারিচন

50

-Sএক্স ৮86 ভিত্তিক সিস্টেমে জিসিসিতে স্যুইচটি ব্যবহার করে ডিফল্টরূপে এটি অ্যান্ড টি সিনট্যাক্সের একটি ডাম্প তৈরি করে, যা -masm=attস্যুইচের সাহায্যে নির্দিষ্ট করা যায়:

gcc -S -masm=att code.c

আপনি যদি ইন্টেল সিনট্যাক্সে ডাম্প উত্পাদন করতে চান তবে আপনি -masm=intelস্যুইচটি ব্যবহার করতে পারেন :

gcc -S -masm=intel code.c

(উভয়ই যথাক্রমে code.cফাইলের মধ্যে তাদের বিভিন্ন বাক্য গঠনতে ডাম্প উত্পাদন code.sকরে)

অবজডাম্পের সাথে একই রকম প্রভাব তৈরি করতে, আপনি --disassembler-options= intel/ attস্যুইচ ব্যবহার করতে চান , একটি উদাহরণ (সিনট্যাক্সের পার্থক্য বর্ণনা করার জন্য কোড ডাম্প সহ):

 $ objdump -d --disassembler-options=att code.c
 080483c4 <main>:
 80483c4:   8d 4c 24 04             lea    0x4(%esp),%ecx
 80483c8:   83 e4 f0                and    $0xfffffff0,%esp
 80483cb:   ff 71 fc                pushl  -0x4(%ecx)
 80483ce:   55                      push   %ebp
 80483cf:   89 e5                   mov    %esp,%ebp
 80483d1:   51                      push   %ecx
 80483d2:   83 ec 04                sub    $0x4,%esp
 80483d5:   c7 04 24 b0 84 04 08    movl   $0x80484b0,(%esp)
 80483dc:   e8 13 ff ff ff          call   80482f4 <puts@plt>
 80483e1:   b8 00 00 00 00          mov    $0x0,%eax
 80483e6:   83 c4 04                add    $0x4,%esp 
 80483e9:   59                      pop    %ecx
 80483ea:   5d                      pop    %ebp
 80483eb:   8d 61 fc                lea    -0x4(%ecx),%esp
 80483ee:   c3                      ret
 80483ef:   90                      nop

এবং

$ objdump -d --disassembler-options=intel code.c
 080483c4 <main>:
 80483c4:   8d 4c 24 04             lea    ecx,[esp+0x4]
 80483c8:   83 e4 f0                and    esp,0xfffffff0
 80483cb:   ff 71 fc                push   DWORD PTR [ecx-0x4]
 80483ce:   55                      push   ebp
 80483cf:   89 e5                   mov    ebp,esp
 80483d1:   51                      push   ecx
 80483d2:   83 ec 04                sub    esp,0x4
 80483d5:   c7 04 24 b0 84 04 08    mov    DWORD PTR [esp],0x80484b0
 80483dc:   e8 13 ff ff ff          call   80482f4 <puts@plt>
 80483e1:   b8 00 00 00 00          mov    eax,0x0
 80483e6:   83 c4 04                add    esp,0x4
 80483e9:   59                      pop    ecx
 80483ea:   5d                      pop    ebp
 80483eb:   8d 61 fc                lea    esp,[ecx-0x4]
 80483ee:   c3                      ret    
 80483ef:   90                      nop

কি ... gcc -S -masm=intel test.cআমার জন্য ঠিক কাজ করেনি, আমি ইন্টেল এবং যেমন AT & T ভালো সিনট্যাক্স কিছু দোআঁশলা করেছেন: mov %rax, QWORD PTR -24[%rbp]পরিবর্তে এই: movq -24(%rbp), %rax
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
সুন্দর টিপ। এটি লক্ষ করা উচিত যে .oএএসএম ফাইলগুলির সমান্তরাল আউটপুট সম্পাদন করার সময় এটি কাজ করে, যেমন-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
আন্ডারস্কোর_ডে

-Mবিকল্পটি ব্যবহার করতে পারা যায়, এটি --disassembler-optionsobjdump -d -M intel a.out | less -N
এরিক ওয়াং

34

গডবোল্ট একটি খুব দরকারী সরঞ্জাম, তাদের তালিকায় কেবল সি ++ সংকলক রয়েছে তবে -x cকোডটি সি হিসাবে গণ্য করার জন্য আপনি পতাকা ব্যবহার করতে পারেন এটি পরে আপনার কোডের পাশাপাশি একটি সমাবেশের তালিকা তৈরি করবে এবং আপনি Colouriseউত্পন্ন বিকল্পটি ব্যবহার করতে পারেন বর্ণিত বারগুলি দৃশ্যত উত্পন্ন সমাবেশে কোন উত্স কোড মানচিত্রের নির্দেশ দেয়। উদাহরণস্বরূপ নিম্নলিখিত কোড:

#include <stdio.h>

void func()
{
  printf( "hello world\n" ) ;
}

নিম্নলিখিত কমান্ড লাইন ব্যবহার করে:

-x c -std=c99 -O3

এবং Colouriseনিম্নলিখিত উত্পন্ন করবে:

এখানে চিত্র বর্ণনা লিখুন


গডবোল্ট ফিল্টার কীভাবে কাজ করে তা জেনে ভাল লাগবে: .LC0, .text, //, এবং ইন্টেল। ইন্টেল সহজ -masm=intelতবে বাকী কি?
জেড বোসন

আমার ধারণা এটি এখানে ব্যাখ্যা করা হয়েছে stackoverflow.com/a/38552509/2542702
জেড বোসন

গডবোল্ট সি-কে সমর্থন করে (আরও এক টন অন্যান্য ভাষার মতো জং, ডি, পাস্কাল ...)। এটি কেবলমাত্র অনেক কম সি সংকলক রয়েছে, তাই সি ++ -x c
সংকলকগুলি

23

আপনি কি চেষ্টা করেছেন gcc -S -fverbose-asm -O source.cতবে উত্পন্নটি সন্ধান করুন looksource.s এসেম্বিলার ফাইলটি ?

উত্পন্ন এসেমব্লার কোডটি এতে যায় source.s(আপনি এটি -o এসেম্বলার-ফাইল নাম দিয়ে ওভাররাইড করতে পারেন ); -fverbose-asmবিকল্প কম্পাইলার কিছু প্রতীকী ভাষান্তর মন্তব্য "ব্যাখ্যা" উত্পন্ন প্রতীকী ভাষান্তর কোড নির্গত অনুরোধ জানাবে। -Oবিকল্প (এটা সঙ্গে আরো নিখুত পারে একটি বিট নিখুত কম্পাইলার জিজ্ঞেস -O2বা -O3)।

আপনি যদি বুঝতে চান যে gccপাস করার চেষ্টা করছেন -fdump-tree-allতবে সতর্ক হন: আপনি শত শত ডাম্প ফাইল পাবেন।

বিটিডাব্লু, জিসিসি প্লাগইনগুলির মাধ্যমে বা মেল্টের সাথে এক্সটেনসিবল ( জিসিসি প্রসারণের জন্য একটি উচ্চ স্তরের ডোমেন নির্দিষ্ট ভাষা; যা আমি 2017 এ পরিত্যাগ করেছি)


সম্ভবত উল্লেখ করুন যে আউটপুটটি হবে source.s, যেহেতু প্রচুর লোকেরা কনসোলে একটি প্রিন্টআউট আশা করবে।
রুবেনলগুনা

1
@ecerulm: -S -o-stdout- এ ডাম্প। -masm=intelআপনি যদি এনএএসএম / ওয়াইএসএম সিনট্যাক্স ব্যবহার করতে চান তবে সহায়ক। (তবে এটি qword ptr [mem]কেবল বিচারের পরিবর্তে ব্যবহার করে , qwordসুতরাং এটি এনএএসএম / ওয়াইএসএম এর চেয়ে বেশি ইন্টেল / এমএএসএম এর মতো)। gcc.godbolt.org ডাম্প পরিপাটি করার একটি দুর্দান্ত কাজ করেছে: allyচ্ছিকভাবে মন্তব্য-কেবল রেখাগুলি, অব্যবহৃত লেবেল এবং একত্রিত নির্দেশাবলী।
পিটার কর্ডেস

2
উল্লেখ করতে ভুলে গেছেন: আপনি যদি "উত্সের অনুরূপ তবে প্রতিটি উত্স লাইনের পরে স্টোর / পুনরায় লোডের শব্দ ছাড়াই" সন্ধান করেন তবে -Ogতার চেয়ে আরও ভাল -O1। এর অর্থ হল "ডিবাগিংয়ের জন্য অনুকূলিতকরণ" এবং উত্সটি যেটি খুব কৌশলযুক্ত / হার্ড-টু-ফলো-অপ্টিমাইজেশান ছাড়াই তৈরি করে যা উত্স যা বলে তার সবকিছু করে। এটি gcc4.8 সাল থেকে উপলব্ধ, তবে ঝাঁকুনি 3.7 এখনও এটি নেই। আইডিকে যদি তারা এর বিপরীতে সিদ্ধান্ত নেয় বা কি করে।
পিটার কর্ডেস

19

আপনি এর জন্য জিজেডিবি ব্যবহার করতে পারেন অ্যাজজডাম্পের মতো।

এই উদ্ধৃতিটি http://source.redhat.com/gdb/c موجودہ/onlinesocs/gdb_9.html#SEC64 থেকে নেওয়া হয়েছে


এখানে ইন্টেল x86 এর জন্য মিশ্র উত্স + সমাবেশ দেখানোর একটি উদাহরণ রয়েছে:

  (জিডিবি) ডিস / মি। মূল
ফাংশন প্রধানের জন্য এসেম্বলারের কোডের ডাম্প:
5
0x08048330:% ebp চাপুন
0x08048331: মুভি% এসপি,% ইবিপি
0x08048333: উপ $ 0x8,% এসএসপি
0x08048336: এবং x 0xfffffff0,% এসএসপি
0x08048339: উপ $ 0x10,% এসএসপি

6 প্রিন্টফ ("হ্যালো। \ N");
0x0804833c: মুভেল $ 0x8048440, (% এসএসপি)
0x08048343: 0x8048284 কল করুন 

7 রিটার্ন 0;
8
0x08048348: মুভি $ 0x0,% ইক্স
0x0804834 ডি: ছেড়ে দিন
0x0804834e: ret

এসেম্বলারের ডাম্পের সমাপ্তি।


এবং জিডিবি'র বিচ্ছিন্নকরণকারীকে ইন্টেল সিনট্যাক্সে স্যুইচ করতে, set disassembly-flavor intelকমান্ডটি ব্যবহার করুন ।
রুসলান

13

জিসিসি-তে (নোট: মূলধন এস) স্যুইচ করুন এবং এটি এস। এক্সটেনশন সহ একটি ফাইলের মধ্যে অ্যাসেম্বলি কোডটি নির্গত করবে। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ড:

gcc -O2 -S -c foo.c


4

আমি জিসিসি-তে কোনও শট দেইনি, তবে জি ++ এর ক্ষেত্রে। নীচের কমান্ডটি আমার পক্ষে কাজ করে। ডিবাগ বিল্ড এবং -Wa এর জন্য -g, -Adln উত্স কোডের সাথে তালিকার জন্য এসেম্বলারের কাছে পাস করা হয়

g ++ -g -Wa, -adln src.cpp


এটি জিসিসির পক্ষেও কাজ করে! -ওয়া, ... এসেম্বলার অংশের জন্য কমান্ড লাইন বিকল্পের জন্য (সিসি / ++ সংকলনের পরে জিসিসি / জি ++ এ চালানো)। এটি অভ্যন্তরীণ হিসাবে (উইন্ডোজে as.exe) হিসাবে প্রার্থনা করে। আরও সহায়তা দেখতে কমান্ড লাইন হিসাবে --help হিসাবে দেখুন
হার্টমুট শোরিগ

0

স্টাডাউটে তালিকা আউটপুট উত্পাদনের জন্য জিসিসি বা জি ++ এর বিকল্প হিসাবে -Wa, -adln ব্যবহার করুন।

-ওয়া, ... এসেম্বলার অংশের জন্য কমান্ড লাইন বিকল্পের জন্য (সিসি / ++ সংকলনের পরে জিসিসি / জি ++ এ চালানো)। এটি অভ্যন্তরীণ হিসাবে (উইন্ডোজে as.exe) হিসাবে প্রার্থনা করে। দেখা

> হিসাবে - সাহায্য

কমান্ড লাইন হিসাবে সিসিএসির ভিতরে এসেম্বলারের সরঞ্জামটির আরও সহায়তা দেখতে help

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.