質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

オブジェクトファイルを自分の手でリンクして実行ファイルにしたい。(リンカを使わないで行いたいです。)

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 2,087

carnage0216

score 131

PCのCPUのアセンブリ言語もCPUに対してだいたいが一対一で対応しているため一つのアセンブリプログラムをアセンブラするならばリンカが必要ないと、参考書やネットなどで調べてわかりました。(高級言語を使う際はリンカがあったほうが便利ですが。)

<行いたいこと>
しかし(Linux上などで)複数のアセンブリプログラムを一つにする場合にはリンカは必要のようで、リンカのように複数のアセンブリプログラムを手作業で一つにまとめて見たいと考えています。
手作業で一つにまとめるとしたら、どの様にアセンブリプログラムを一つにまとめるのでしょうか?
調べたうちの方法の一つとしてハンドアセンブルというものがリンカの代わり?になるとも書いてありました。

できるならばマイコンなどのアセンブリ言語から始めたいと思っています。AVRなど。
いずれはLinuxをいれたPCで行いたいと思っています。

<達成目標>
私はリンカを使わないでアセンブリプログラムを一つにする方法が知りたいです!

どうかよろしくお願いします。

膨大なアセンブリプログラムをリンカを使わずに一つにするのに何か月何年かかっても構いません。

<編集>
解答して頂いた皆様どうもありがとうございます。
補足させていただきます。

OSはLinuxで想定しています。また本の一説なのかわかりませんがリンカがなかった昔の時代、自分でハンドアセンブルをしてオブジェクトファイルをリンクして実行ファイルを出力していたと書いてありました。(昔なので今のような64bitではなく、8bitなどのマイコンだと思います)
しかし、使っているPCのCPUは複雑すぎてハンドアセンブルするには不向きです。データシートがあったとしても初心者の私には無謀だし、無理です。なのでAVR、(Linuxを搭載した)ラズパイなどでハンドアセンブリを行いリンカの仕事を私の手でやってみます。
もしかしたら、AVR、(Linuxを搭載した)でハンドアセンブルが慣れればPCのCPUでもハンドアセンブルできるようになるかもしれませんがまだまだ先の話です。

<編集2>
確かに、アセンブラがあるのに、ハンドアセンブルでリンクする必要はないかもしれませんが、機械語(に直されたアセンブリ命令)をどうやって機械語で書いてあるオブジェクトファイルに使って実行ファイルにしたのか凄くきになるのです。
AVRマイコンにしても(Linuxを搭載した)ラズパイにしても、
機械語で書かれたオブジェクトファイルにハンドアセンブルして得た機械語を付け加えることで実行ファイルにしたのか、気になって仕方がありません

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • carnage0216

    2018/03/16 22:48

    申し訳ありません。丸投げしたつもりはないのですが、読み直してみると確かにソースコード愚か、実践的なことがないため丸投げ呼ばわりされても仕方ありません。どうか数時間かかりますが修正しますのでお待ちください。

    キャンセル

  • carnage0216

    2018/03/18 20:35

    リンカなしに実行ファイルが得られる場合と得られない場合があるようです。今はアセンブリ言語の取得のために勉強に専念します。皆様どうもありがとうございました。

    キャンセル

回答 7

+6

こんにちは。

CPUに対してだいたいが一対一で対応しているため一つのアセンブリプログラムをアセンブラするならばリンカが必要ないと、参考書やネットなどで調べてわかりました。

アセンブルするのにリンカは不要です。実行可能形式へ変換するためにリンカが必要です。
もし、実行できるようにしたいのであれば、例え1つのアセンブリプログラムといえどもリンカ無しは現実的ではありません。

実行できるようにするわけでないなら、アーカイバを使って静的リンク・ライブラリに纏めることは可能です。

膨大なアセンブリプログラムをリンカを使わずに一つにするのに何か月何年かかっても構いません。

バイナリ・エディタを使って手で実行可能形式を作ることは不可能ではないと思います。実行可能形式のフォーマットの調査から始める場合は"Hello, world!"さえ1ヶ月くらい掛かるかも?
もし、これをされたいのであれば、実行可能形式のフォーマットが記載されているサイトや本について質問されたほうが良いと思います。対象OSを限定しないと回答は得られにくいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/17 14:17

    なんか、すいませんでした。

    キャンセル

  • 2018/03/17 14:24

    実行形式ファイルについて気になるのだったら、どこかでもコメントしましたがELFフォーマットやCOFFフォーマットについて理解を深めてください。

    キャンセル

  • 2018/03/17 14:28

    はい。わかりました。
    皆さんどうもありがとうございました。
    一時的に終了させて頂きます。

    キャンセル

checkベストアンサー

+4

こんにちは。

元の回答のコメント・ツリーが長くなったことと、編集された質問への回答で回答内容が異なりますので、別途回答します。

リンカがなかった昔の時代、自分でハンドアセンブルをしてオブジェクトファイルをリンクして実行ファイルを出力していたと書いてありました。

ハンドアセンブルしていた時代は、オブジェクト・ファイルや実行ファイルなどは存在しないと思います。紙テープなどが良く使われていた頃と思います。
ハンドアセンブルの結果は、紙に手書きしたり、紙テープにパンチしたりです。
上記リンクは普通の紙に(恐らく)手書きしたブートローダをトグルスイッチでパチパチと入力した後、紙テープに記録されていたBasicインタプリタをロードして起動している動画です。

AVR、(Linuxを搭載した)

私がAVRを触っていた頃よりかなり進歩しているのでもしかするとあるかも知れませんが、基本的にAVRはlinuxを搭載できるようなCPUではありません。

また、ハンドアセンブルして実行可能形式を作るようなローレベルなことを行う場合は OSは無いほうがよいです。
OSの各種の約束事を学習するだけでも大変です。それらを学習する前にまずはOS上で「普通」のC言語プログラムを開発するスキルは必須です。
そして、OSのメモリ管理などの概念も把握しておかないと理解できませんので、OS配下の実行可能形式のフォーマットを理解するにはそれなりに膨大な時間がかかります。
OS配下のリンカは実行可能形式への変換を自動的に行ってくれますが、それを手でやるためには上記の理解が必要になります。

ハンドアセンブルでリンク

アセンブルとリンクは全く別の作業です。「ハンドアセンブルでリンクする」は「自転車をこいで海を渡る」という文と同じように間違った文です。単なるタイプミスなら良いのですが、複数回このような記述をされているので、アセンブルとリンクの役割を理解されていないと思います。仕組みを把握する前に役割を理解しないと無理があると思います。

機械語(に直されたアセンブリ命令)をどうやって機械語で書いてあるオブジェクトファイルに使って実行ファイルにしたのか凄くきになるのです。

意訳すると「アセンブリ言語で書かれたソース・ファイルから実行可能形式ファイルが作られるまでの過程が凄く気になるのです」でしょうか?
もし、YESの場合、AVRでは微妙にイメージが異なるかもしれません(クロス開発になる)が、単純ですから学習に向いており、かつ、情報も多く価格も安いので進めやすいと思います。
なお、この方向性はどちらかというと組み込み系のプログラムに有用です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/17 19:35

    ケイロニアンさん、私の書いた文脈が悪かったです。「AVRマイコンにしても(Linuxを搭載した)ラズパイ」に関してLinuxを搭載したラズパイとAVRと言いたかったのです。
    流石の私でもAVRに小さなOSは入れられるかもしれませんが、Linuxは無理なことくらいはわかります。(苦笑い)

    キャンセル

  • 2018/03/17 21:25

    あ、なるほど。それもそうですね。失礼しました。

    キャンセル

  • 2018/03/19 20:09 編集

    ラズパイはよく分かってないですが、AVRならアセンブラも楽しいかもd^^ IOポートも5V出せるからLEDを直に駆動できます。タイマの割り込みで結構いろんな事できたりします。音楽に合わせてLEDピカピカとかw・・・データシートやプログラムモデルは把握しておいてくださいねd^^ 電源投入やリセット動作がどう動くとか分かってないと何もできません。参考:http://www.geocities.jp/side2949be/AVRStudio_index.html

    キャンセル

+4

こんにちは。
これまでの質問を含め、注視させてもらっていました。

今回の質問も収束するかと思ったのですが、質問の補足が追加されてどうもまだまだ閉じられる様子がなかったので。これまで有益な回答が多々されていたところに今更感もあり、瑣末で恐縮ですが、いち回答として受け留めてもらえれば、と。

最初に余計なことですがひとこと書かせてください。もとの回答から新たに発した質問に対する回答をコメント欄で求めるのはお止めになった方がよろしいかと思います。回答者様の多大な負担になります。

本題ですが、マイコンを取ってみてもその種類により、実際にはリンク作業はそのCPUボードのハードウェア構成やメモリマップによってアドレスが変わりますし、例えばジャンプ命令ひとつ取っても絶対/相対アドレッシングについてリンク過程で再計算が行われ、最終的な実行形式ファイルに書き込まれます。

それらを手動でリンクできたとしてもそれをどうCPUボードに載せて実行すると思いますか。PCではなく、組み込みのワンチップマイコンやCPUボードではインテルHEXフォーマットやモトローラSレコードと呼ばれるテキスト形式のファイルにして、CPUボードに転送して書き込んだりします。プログラムはCPUがリセットされて所定のアドレスから自動的に実行されるのに依存して動作します。AVRが載っているボードとしてはArduinoが有名ですが、これとてビルド(コンパイル〜リンク)して出来たイメージをArduinoへシリアル通信で転送して書き込みます。

PCで動くLinuxやWindowsなどのOSでは、ハードディスク等の外部記憶装置に保存されたファイルを読み出し、ファイルに付いているヘッダー情報をもとにOSが実行形式を特定して適切にメモリにロードし、必要ならアドレス情報を書き換えてそのプログラムを実行します。実行ファイルの形式についてはLinuxではELF、WindowsではPE(COFF)がありますので興味があればご自分で調べてみてください。

要はOSやハードウェアが違えば「リンク」や「ロード」して「実行」すると言う基本的な仕組み/概念が同じでも、実現手段である実装で変わってくると言うことです。それがある為、これまで、回答者の皆さんが当質問への回答に苦慮されています。

そう言ったことを理解するには、前提としてこれまで他の回答者様が言われていたように基本的なことを勉強した上で実際に手を動かし、思ったように動かないならば何故動かないのかを自分で考えて、それでもどうしても分からなければこういったteratailのような質問サイトで尋ねるとのようなかたちになるかと思います。※teratailのキャッチコピー「15分調べても分からないことは、質問しよう!」には反しますがw

低レイヤーのものやOSの仕組みに興味がある私としては、carnage0216さんのやりたいことが理解できない訳ではないです。

でも、「膨大なアセンブリプログラムをリンカを使わずに一つにするのに何か月何年かかっても構いません。」と言う目標ひとつを挙げても、本当にやるのであれば極めてマニュアル的で、退屈なわりに神経と時間を使う作業になるのは容易に予想できます。不可能とは言わないまでも、到底お勧めできることではありません。他に優先して勉強した方が良いことがあるでしょう。

そうではなく、これまで勧められてきたような基本的なことを実際に手を動かして理解したあとでは、今の目標とやりたいことも恐らく変わってくると思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/17 14:26

    ご迷惑ばかりおかけしてしてしまいすいませんでした。
    質問は一時的にこれだけで終わりにさせて頂きます。
    本当に申し訳ありませんでした。

    キャンセル

  • 2018/03/17 14:32

    他の回答者様も書かれていますが、好奇心があること自体は大変良いことだと思いますので、あまり萎縮されないよう。優先度つけて、手を動かし、好奇心を満たせるよう勉強されると良いと思います

    キャンセル

  • 2018/03/17 16:51

    dodox86さん、ご指摘、どうもありがとうございます。
    出直してきます。
    また、このサイトを利用させていただくときはどうかよろしくお願い致します。

    キャンセル

+2

家を建てたいです。
のこぎりの使い方を教えてください
と聞かれているようなw

別に、なにかをするというのはあなたの自由だけど、そのためになにかをするわけでなく、他人に質問丸投げってのはどーにかしたほうがいいんでない?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 16:35

    知識をつけたつもりで質問したつもりがこのざまになってしまい不甲斐ないです。
    そうですね。いい加減にした方がよいかもですね。

    キャンセル

  • 2018/03/16 16:48

    そう思われるならどうぞ教えてやってください。(あ、アオリ抜きで文字通りの意味で取ってください)
    べつに教えてやろうという貴重な意思を邪魔するつもりはありません。

    私は、自分では何一つしようとしないで他人に丸投げで質問し、その回答を受けたところで、愚にもつかない理屈をつけてその回答を無視してのけるやつが嫌いなだけです
    あくまでもこれは私個人の感情でしか過ぎないので、お気になさらないよう。

    キャンセル

  • 2018/03/16 17:23

    確かに、過去の回答では甘ったれた丸投げ質問もあります。不快にさせてしまい申し訳ありません。
    愚にもつかない理屈をつけてその回答を無視してのけるやつと思われていたのはすごく悲しいです。
    僕は実行していますが、実行をするよりも前の下準備、すなわちここで気がすむまで質問をしてから実行に進みます。
    この姿勢が良くなかったのですね。

    キャンセル

+2

CPUが動く仕組みを知りたいのならこちらのシンプルなエミュレータでお試しください。

http://www.softantenna.com/wp/webservice/simple-8-bit-assembler-simulator/
http://schweigi.github.io/assembler-simulator/

現代的なシステムは難解過ぎます。


自分でリンクをするモチベーションがわかりません。
一般的には辞書を突き合わせる単純作業です。

リンカについてのいろいろな説明。
https://www.grapecity.com/tools/support/powernews/column/clang/003/page01.htm
http://sandragon.hatenablog.com/entry/2013/08/11/193936
http://p.booklog.jp/book/74354/page/1846900
https://プログラマが知るべき97のこと.com/エッセイ/リンカは魔法のプログラムではない/
http://sa.eei.eng.osaka-u.ac.jp/eeisa003/tani_prog/HOWTOprogC/compile.htm

http://chimolog.co/2017/06/bto-cpu-clock.html
CPUは凄まじい速度で単純処理をします。
Intel Core i7 7740X → 4.30 ~ 4.50Ghz

何か月何年かかっても構いません

大規模なリンクは何世代にも渡る大事業になるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/16 21:25

    なんにしても僕は未熟者です。Cとアセンブラとリンカについて1から学ぶ必要があります。

    キャンセル

  • 2018/03/17 21:59

    まだリンカを自作するとかのほうがどう考えても現実的…

    キャンセル

+1

ざっくりいうとシンボル解決して、アドレスを割り付けるだけです。
手動でやるんだから割り付けるアドレスはマイコンのデータシートからメモリのレイアウト見て決めてください。レジスタしか使わないのであればこの作業は要りません。

とりあえず使うマイコンを決めてデータシート、あとはコンパイラとかリンカーのドキュメントを見てください。物によってはマイコンとは別に命令セットだけのドキュメントがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

アセンブラ次第でリンカを使わないで実行ファイルが得られる

・・・ことはありません・・・以下が理解できますか?

元のソース

#include <stdio.h>

int main(void)
{
    printf("Hello Word!\n");

    return 0;
}
ーーーー
アセンブラソース(元のソースを-Sオプションで出力したもの)
    .text
    .file    "tst.c"
    .globl    main                    # -- Begin function main
    .p2align    4, 0x90
    .type    main,@function
main:                                   # @main
    .cfi_startproc
# BB#0:
    pushq    %rax
    .cfi_def_cfa_offset 16
    movl    $.Lstr, %edi
    callq    puts
    xorl    %eax, %eax
    popq    %rcx
    retq
.Lfunc_end0:
    .size    main, .Lfunc_end0-main
    .cfi_endproc
                                        # -- End function
    .type    .Lstr,@object           # @str
    .section    .rodata.str1.1,"aMS",@progbits,1
.Lstr:
    .asciz    "Hello Word!"
    .size    .Lstr, 12


    .ident    "clang version 6.0.0 (trunk 319536)"
    .section    ".note.GNU-stack","",@progbits
ーーーー
実行ファイル(上のアセンブル結果をリンカを通すと以下の様になります)
00000000004003c0 <_init>:
  4003c0:    48 83 ec 08              sub    $0x8,%rsp
  4003c4:    48 8b 05 2d 0c 20 00     mov    0x200c2d(%rip),%rax        # 600ff8 <_DYNAMIC+0x1d0>
  4003cb:    48 85 c0                 test   %rax,%rax
  4003ce:    74 05                    je     4003d5 <_init+0x15>
  4003d0:    e8 3b 00 00 00           callq  400410 <__gmon_start__@plt>
  4003d5:    48 83 c4 08              add    $0x8,%rsp
  4003d9:    c3                       retq   

セクション .plt の逆アセンブル:

00000000004003e0 <puts@plt-0x10>:
  4003e0:    ff 35 22 0c 20 00        pushq  0x200c22(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
  4003e6:    ff 25 24 0c 20 00        jmpq   *0x200c24(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
  4003ec:    0f 1f 40 00              nopl   0x0(%rax)

00000000004003f0 <puts@plt>:
  4003f0:    ff 25 22 0c 20 00        jmpq   *0x200c22(%rip)        # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
  4003f6:    68 00 00 00 00           pushq  $0x0
  4003fb:    e9 e0 ff ff ff           jmpq   4003e0 <_init+0x20>

0000000000400400 <__libc_start_main@plt>:
  400400:    ff 25 1a 0c 20 00        jmpq   *0x200c1a(%rip)        # 601020 <_GLOBAL_OFFSET_TABLE_+0x20>
  400406:    68 01 00 00 00           pushq  $0x1
  40040b:    e9 d0 ff ff ff           jmpq   4003e0 <_init+0x20>

0000000000400410 <__gmon_start__@plt>:
  400410:    ff 25 12 0c 20 00        jmpq   *0x200c12(%rip)        # 601028 <_GLOBAL_OFFSET_TABLE_+0x28>
  400416:    68 02 00 00 00           pushq  $0x2
  40041b:    e9 c0 ff ff ff           jmpq   4003e0 <_init+0x20>

セクション .text の逆アセンブル:

0000000000400420 <set_fast_math>:
  400420:    0f ae 5c 24 fc           stmxcsr -0x4(%rsp)
  400425:    81 4c 24 fc 40 80 00     orl    $0x8040,-0x4(%rsp)
  40042c:    00 
  40042d:    0f ae 54 24 fc           ldmxcsr -0x4(%rsp)
  400432:    c3                       retq   

0000000000400433 <_start>:
  400433:    31 ed                    xor    %ebp,%ebp
  400435:    49 89 d1                 mov    %rdx,%r9
  400438:    5e                       pop    %rsi
  400439:    48 89 e2                 mov    %rsp,%rdx
  40043c:    48 83 e4 f0              and    $0xfffffffffffffff0,%rsp
  400440:    50                       push   %rax
  400441:    54                       push   %rsp
  400442:    49 c7 c0 a0 05 40 00     mov    $0x4005a0,%r8
  400449:    48 c7 c1 30 05 40 00     mov    $0x400530,%rcx
  400450:    48 c7 c7 20 05 40 00     mov    $0x400520,%rdi
  400457:    e8 a4 ff ff ff           callq  400400 <__libc_start_main@plt>
  40045c:    f4                       hlt    
  40045d:    0f 1f 00                 nopl   (%rax)

0000000000400460 <deregister_tm_clones>:
  400460:    b8 3f 10 60 00           mov    $0x60103f,%eax
  400465:    55                       push   %rbp
  400466:    48 2d 38 10 60 00        sub    $0x601038,%rax
  40046c:    48 83 f8 0e              cmp    $0xe,%rax
  400470:    48 89 e5                 mov    %rsp,%rbp
  400473:    77 02                    ja     400477 <deregister_tm_clones+0x17>
  400475:    5d                       pop    %rbp
  400476:    c3                       retq   
  400477:    b8 00 00 00 00           mov    $0x0,%eax
  40047c:    48 85 c0                 test   %rax,%rax
  40047f:    74 f4                    je     400475 <deregister_tm_clones+0x15>
  400481:    5d                       pop    %rbp
  400482:    bf 38 10 60 00           mov    $0x601038,%edi
  400487:    ff e0                    jmpq   *%rax
  400489:    0f 1f 80 00 00 00 00     nopl   0x0(%rax)

0000000000400490 <register_tm_clones>:
  400490:    b8 38 10 60 00           mov    $0x601038,%eax
  400495:    55                       push   %rbp
  400496:    48 2d 38 10 60 00        sub    $0x601038,%rax
  40049c:    48 c1 f8 03              sar    $0x3,%rax
  4004a0:    48 89 e5                 mov    %rsp,%rbp
  4004a3:    48 89 c2                 mov    %rax,%rdx
  4004a6:    48 c1 ea 3f              shr    $0x3f,%rdx
  4004aa:    48 01 d0                 add    %rdx,%rax
  4004ad:    48 d1 f8                 sar    %rax
  4004b0:    75 02                    jne    4004b4 <register_tm_clones+0x24>
  4004b2:    5d                       pop    %rbp
  4004b3:    c3                       retq   
  4004b4:    ba 00 00 00 00           mov    $0x0,%edx
  4004b9:    48 85 d2                 test   %rdx,%rdx
  4004bc:    74 f4                    je     4004b2 <register_tm_clones+0x22>
  4004be:    5d                       pop    %rbp
  4004bf:    48 89 c6                 mov    %rax,%rsi
  4004c2:    bf 38 10 60 00           mov    $0x601038,%edi
  4004c7:    ff e2                    jmpq   *%rdx
  4004c9:    0f 1f 80 00 00 00 00     nopl   0x0(%rax)

00000000004004d0 <__do_global_dtors_aux>:
  4004d0:    80 3d 5d 0b 20 00 00     cmpb   $0x0,0x200b5d(%rip)        # 601034 <_edata>
  4004d7:    75 11                    jne    4004ea <__do_global_dtors_aux+0x1a>
  4004d9:    55                       push   %rbp
  4004da:    48 89 e5                 mov    %rsp,%rbp
  4004dd:    e8 7e ff ff ff           callq  400460 <deregister_tm_clones>
  4004e2:    5d                       pop    %rbp
  4004e3:    c6 05 4a 0b 20 00 01     movb   $0x1,0x200b4a(%rip)        # 601034 <_edata>
  4004ea:    f3 c3                    repz retq 
  4004ec:    0f 1f 40 00              nopl   0x0(%rax)

00000000004004f0 <frame_dummy>:
  4004f0:    48 83 3d 28 09 20 00     cmpq   $0x0,0x200928(%rip)        # 600e20 <__JCR_END__>
  4004f7:    00 
  4004f8:    74 1e                    je     400518 <frame_dummy+0x28>
  4004fa:    b8 00 00 00 00           mov    $0x0,%eax
  4004ff:    48 85 c0                 test   %rax,%rax
  400502:    74 14                    je     400518 <frame_dummy+0x28>
  400504:    55                       push   %rbp
  400505:    bf 20 0e 60 00           mov    $0x600e20,%edi
  40050a:    48 89 e5                 mov    %rsp,%rbp
  40050d:    ff d0                    callq  *%rax
  40050f:    5d                       pop    %rbp
  400510:    e9 7b ff ff ff           jmpq   400490 <register_tm_clones>
  400515:    0f 1f 00                 nopl   (%rax)
  400518:    e9 73 ff ff ff           jmpq   400490 <register_tm_clones>
  40051d:    0f 1f 00                 nopl   (%rax)

0000000000400520 <main>:
  400520:    50                       push   %rax
  400521:    bf c0 05 40 00           mov    $0x4005c0,%edi
  400526:    e8 c5 fe ff ff           callq  4003f0 <puts@plt>
  40052b:    31 c0                    xor    %eax,%eax
  40052d:    59                       pop    %rcx
  40052e:    c3                       retq   
  40052f:    90                       nop

0000000000400530 <__libc_csu_init>:
  400530:    41 57                    push   %r15
  400532:    41 89 ff                 mov    %edi,%r15d
  400535:    41 56                    push   %r14
  400537:    49 89 f6                 mov    %rsi,%r14
  40053a:    41 55                    push   %r13
  40053c:    49 89 d5                 mov    %rdx,%r13
  40053f:    41 54                    push   %r12
  400541:    4c 8d 25 c0 08 20 00     lea    0x2008c0(%rip),%r12        # 600e08 <__frame_dummy_init_array_entry>
  400548:    55                       push   %rbp
  400549:    48 8d 2d c8 08 20 00     lea    0x2008c8(%rip),%rbp        # 600e18 <__init_array_end>
  400550:    53                       push   %rbx
  400551:    4c 29 e5                 sub    %r12,%rbp
  400554:    31 db                    xor    %ebx,%ebx
  400556:    48 c1 fd 03              sar    $0x3,%rbp
  40055a:    48 83 ec 08              sub    $0x8,%rsp
  40055e:    e8 5d fe ff ff           callq  4003c0 <_init>
  400563:    48 85 ed                 test   %rbp,%rbp
  400566:    74 1e                    je     400586 <__libc_csu_init+0x56>
  400568:    0f 1f 84 00 00 00 00     nopl   0x0(%rax,%rax,1)
  40056f:    00 
  400570:    4c 89 ea                 mov    %r13,%rdx
  400573:    4c 89 f6                 mov    %r14,%rsi
  400576:    44 89 ff                 mov    %r15d,%edi
  400579:    41 ff 14 dc              callq  *(%r12,%rbx,8)
  40057d:    48 83 c3 01              add    $0x1,%rbx
  400581:    48 39 eb                 cmp    %rbp,%rbx
  400584:    75 ea                    jne    400570 <__libc_csu_init+0x40>
  400586:    48 83 c4 08              add    $0x8,%rsp
  40058a:    5b                       pop    %rbx
  40058b:    5d                       pop    %rbp
  40058c:    41 5c                    pop    %r12
  40058e:    41 5d                    pop    %r13
  400590:    41 5e                    pop    %r14
  400592:    41 5f                    pop    %r15
  400594:    c3                       retq   
  400595:    90                       nop
  400596:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
  40059d:    00 00 00 

00000000004005a0 <__libc_csu_fini>:
  4005a0:    f3 c3                    repz retq 

セクション .fini の逆アセンブル:

00000000004005a4 <_fini>:
  4005a4:    48 83 ec 08              sub    $0x8,%rsp
  4005a8:    48 83 c4 08              add    $0x8,%rsp
  4005ac:    c3                       retq   

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/17 22:13

    あの、最後のセクション .fini の逆アセンブル:

    00000000004005a4 <_fini>:
    4005a4: 48 83 ec 08 sub $0x8,%rsp
    4005a8: 48 83 c4 08 add $0x8,%rsp
    4005ac: c3 retq
    は何を表しているのですか?

    キャンセル

  • 2018/03/17 22:14

    正直ほとんどわかりません。Cソースをみてはじめてどのような動きをわかりました。

    キャンセル

  • 2018/03/17 22:15

    GCCの方でアセンブリ変換して読んでみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C++に関する質問
  • オブジェクトファイルを自分の手でリンクして実行ファイルにしたい。(リンカを使わないで行いたいです。)