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

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

ただいまの
回答率

90.52%

  • C++

    4423questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Arduino

    672questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

  • アセンブリ言語

    116questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

  • CPU

    52questions

  • リンカ

    7questions

    リンカはコンパイルされたオブジェクトコードに、必要なライブラリなどを付け加えて、実行可能ファイルを生成するプログラムです。コンパイルされたオブジェクトのコードを複数のファイルで取得し、"linked"という一つの実行可能のファイルを生成します。

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

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 1,604

carnage0216

score 122

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/16 15:20 編集

    迅速な解答ありがとうございます。
    あの、ちなみになぜ、例え1つのアセンブリプログラムといえどもリンカ無しは現実的でないのでしょうか?

    キャンセル

  • 2018/03/16 15:25

    私なりに理解したのですが、リンカを使わないやりかたとして。
    例えばモジュールが4つあるとします。1つ目のモジュールのアドレスを0x00と指定します。1つ目のモジュールが終わるのが0x09になるとわかったので、2つ目のモジュールのアドレスを0x0Aと指定しました。2つ目のモジュールが終わるのが0x0Eとわかった為、3つ目のモジュールのアドレスを0x1Cと指定していき...4つ目も同様にして行くことがリンカを手作業で書く。
    これでアセンブルすれば、実行ファイルが得られるのでしょうか?
    どうかよろしくお願い致します。

    キャンセル

  • 2018/03/16 15:59

    「AXレジスタの値に3を足す」というようなCPUの内部で動作が完結するプログラムの実行ファイルであれば可能でしょう。"Hello, world!"にするには画面表示などのシステムコールを使う必要があるので、OSに関する知識(システムコールの使い方等々)が必要になります。

    キャンセル

  • 2018/03/16 16:27

    carnage0216さん。
    一般的なPC用OS配下の場合、そんなに単純なものではありません。
    また、コメントを見る限りリンク→アセンブルと思われているように見えますが、それは間違いです。一般にアセンブルしてオブジェクト・ファイルに変換します。そして、オブジェクト・ファイルをリンカにて加工して実行形式へ変換します。つまり、アセンブル→リンクの順序です。

    しかし、carnage0216さんはご自身の疑問のブレークダウンに失敗しているように感じられます。
    もっと具体的に質問された方が的確な回答が返って来やすいです。
    今回の場合、最終目標が曖昧すぎます。「複数のアセンブリプログラムを一つにする」方法は多数あります。zip圧縮もその一つですね。(まあ、zip圧縮ではないとは思いますが。)しかし、実行形式を作るという意味でもなさそうです。OSさえ特定されませんし。もしかして静的リンクライブラリなのか、はたまたそれ以外の何か?なのか、ゴールが見えないです。

    もし、このままPCをお使いになるのであれば、まずはアセンブラのことを忘れて、C言語で複数のソースを1つに纏めてきちんと動作する極簡単な実行可能形式ファイルを作ってみませんか? そのビルド課程を1つ1つ明らかにしていくことによって疑問をブレークダウンできると思います。

    キャンセル

  • 2018/03/16 17:18

    解答とご指摘、ありがとうございます。
    あの私の勘違いかもしれませんが、アセンブルはアセンブリ言語を機械語に変換するして実行ファイルを生成するのではないのですか?
    えーと、実行ファイルにしてから、リンカが実行ファイルを収納するメモリを指定して複数の実行ファイルを入れて、1つの実行ファイルが出来て、はじめて実行されるわけですか?

    理解力が乏しくてすいません。

    キャンセル

  • 2018/03/16 17:30

    「実行ファイル」の意味が分かりません。一般にアセンブラの出力はオブジェクト・ファイルです。1つ以上のオブジェクト・ファイルをリンクして実行可能形式ファイルへ変換するのがリンカです。
    つまり、オブジェクト・ファイルと実行可能形式ファイルは別物です。

    ところで、すいません。下記を見通してました。

    > できるならばマイコンなどのアセンブリ言語から始めたいと思っています。AVRなど。

    AVRでやるのでしたら、まずはAVRのアセンブラで動作するプログラムを作ってみましょう。その経験があれば、今回の質問はもっと的を射たものになると思います。
    コンピュータ学習の初期段階ではどんどん当たって砕けるべきです。ハードの学習と違ってお金かかりませんし、ゴミも出ません。コンピュータがどのように振る舞うのかは、やってみて確認するのが一番の近道です。

    キャンセル

  • 2018/03/16 21:27

    AVRって小さいのに凄いですよね リンカの勉強とかもできるかな…。

    キャンセル

  • 2018/03/16 21:36

    AVRのすごさを見ていただきたいのですが
    こちらの動画を見てください!!
    https://www.youtube.com/watch?v=GRlsn5qBvH8

    キャンセル

  • 2018/03/16 22:42

    えっ!
    動画のAVRは8bitのATmega328(20MHz?)のようです。高々20MHzのマイコンで動画処理できるのはかなり驚きです。かなり工夫していそうな感じがしますが、すごいですね!!

    キャンセル

  • 2018/03/16 22:46

    インテルのCPUより規模の小さいマイコンでここまで性能が出せるって、アセンブリ言語や配線自体を物理的に工夫したのでしょうね。最近のマイコンは凄いです。
    私も最初はGPUかラズパイのCPUかと思いました。
    喜んでいただけて良かったです。
    どうもありがとうございます。

    キャンセル

  • 2018/03/17 04:17

    リンク先のAVRの動画を見てみました。すごいですね!
    ソースコードも貼ってありましたが処理速度の観点で特に工夫している感じもなかったです。
    検出対象を色相を固定したサークルに限定しているのが効いてるんでしょうかね。

    キャンセル

  • 2018/03/17 08:34

    処理速度の観点で特に工夫している感じもなかった
    え!?そうなんですか!!さすがAVRマイコンPICより使える。

    キャンセル

  • 2018/03/17 10:04

    Chironianさん

    > 高々20MHzのマイコンで動画処理できるのはかなり驚きです。

    ソースを見てみましたが、動画処理をしているのはPC側ですね。Arduinoはカメラの向きを制御しているだけです。

    OpenCVでカメラからの映像を解析して対象物(手に持っているもの)の座標を割り出し、それが画面からはみ出さないようにシリアルポート経由でArduinoにコマンドを送り、Arduinoは受け取ったコマンドに応じてモーターを制御しているだけです。カメラの向きを変える程度のモーター制御なら、8bitマイコンでも余裕でできるでしょう。

    キャンセル

  • 2018/03/17 10:05

    水を差すようで申し訳ないのですが、先の動画のソースコード読みましたがAVR(Arduino)側ってWebカメラ乗っけてるサーボモータの制御しかしていないような気がします。画像処理(トラッキング)はPCでやってますよね?

    キャンセル

  • 2018/03/17 10:40

    リンカの動作原理を知りたいという好奇心はあって当然ですが、

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

    となると、全く無駄な努力です。他の質問にも「全く意味がない」と回答した方がいらっしゃいましたね。プログラミング力を伸ばすことにも役に立ちません。そういうことって、人手でやることではない、膨大な単純作業で、既にあるリンカを使えは一瞬で済むことですから。プログラミング力をつけたかったら、そんなことに構わず、ひとつでも多くのコードを書いてデバッグすること。

    好奇心の向く先がズレてると思います。疑問のブレークダウンに失敗している、とおっしゃるChironianさんの指摘は正しいと思います。なぜブレークダウンに失敗するかというと、様々な事項について、普通のレベルの理解ができていないからだと思います。上っ面の言葉だけで理解しようとしているように見える。お書きになる日本語の文章もいろいろおかしい。耳学問が勝っていて自分の経験でつかんだ実感に乏しいのだと思います。プログラミング力自体も疑わしいと見てます。私が企業の採用担当なら、あなたのような受け答えをする人は採用しません。
    曖昧な理解のまま、ピントのはずれた質問を繰り返していても、動画のような実のある成果は得られないでしょう。すべきことは、一刻も早く(例えば)AVRマイコンを使って、実際に動くプログラムを一つでも多く書き、デバッグし、それを材料に確実な見識を増やしていくこと。それと、身近に相談できる相手を見つけることです。

    キャンセル

  • 2018/03/17 10:49

    「膨大な単純作業で、既にあるリンカを使えは一瞬で済むことですから。」
    その膨大な単純作業とはオブジェクトファイルをまとめて、メモリに入れるってことですよね。

    「私が企業の採用担当なら、あなたのような受け答えをする人は採用しません。」言われてみるとすごく悲しい気持ちになります。

    そうですね。身近に相談者が必要と感じてバイトで貯めたお金でプログラミングスクールでも通おうと考えています。

    キャンセル

  • 2018/03/17 10:51

    > 動画処理をしているのはPC側

    そういうことか。なるほど。これも私の言葉で言えば「処理には階層がある」こと。階層毎に役割がありますけど、大まかにでもそうした構成がつかめていないから、printf()を調べればビットマップ処理に辿り着けると思ったり、(どのプログラムか不明だが)プログラムを逆アセンブルすると「cpuにつながる外部装置」の情報が得られると思ったりするのでしょう。

    キャンセル

  • 2018/03/17 10:56

    > すごく悲しい気持ちになります

    申し訳ないけど、ズレてることに気づいてもらいたいので、きつい言い方をしますが、学校で情報処理を学んできました、という人にもズレた人は何%か実際にいるようで、実際にお目にかかることがあるものですから。

    キャンセル

  • 2018/03/17 10:59

    アセンブラによって得られたオブジェクトファイルを実行ファイルにするためにリンカを手作業で、ハンドアセンブルしようと考えていました。嫌になりますよ。なんでこんなアセンブリ言語を勉強していたつもりがなぜかリンカを自作しようとかおもうなんて。
    あの、リンカなんて自作したりしなくていいメリットとかを教えていただけないでしょうか。
    たぶんリンカ自作とかハンドアセンブリとか考えているのでこのままではアセンブリはおろかcの勉強すら手につかなそうです。
    ただ心のどっかではリンカをいじることも楽しいのではないかと思っていました。

    キャンセル

  • 2018/03/17 10:59

    > その膨大な単純作業とはオブジェクトファイルをまとめて、メモリに入れるってことですよね

    ほら、間違い。
    既にどなたかが指摘されてますように、リンカは「メモリに入れる」ことはしません。こんな単純な勘違いも、体験が乏しく、自分で確かめていない、ので実感がないからだろうと思います。

    キャンセル

  • 2018/03/17 11:01

    そうだったのですね。私は言葉の裏の意味をうまくとらえることができないことがあり本当の意味に気付けませんでした。

    キャンセル

  • 2018/03/17 11:11

    「ハンドアセンブリ」とは言いません。ハンドアセンブルです。
    アセンブル/アセンブリ言語/アセンブラ assemble/assembly language/assembler です。動詞なのか、言語処理系なのか、位は使い分けしようよ。

    > リンカをいじることも楽しいのではないか

    これ、リンカそのものをいじりたい、という文章だけど、もともとの質問はリンカの代りに自分の手でリンクしてみたい、ということじゃありませんでしたか。これも首尾一貫しない、おかしな文章だと思います。きちんと理解しコミュニケーションするにはまともな文章でないとねえ。。。

    キャンセル

  • 2018/03/17 11:18

    まともなコミュニケーションが取れずにすいませんでした。
    おっしゃる通り、最初は確かに自分手でリンクしたいと書いていました。
    しかし、自信がなくなり既にあるリンカをいじれればいいと甘い考えに浸っていました。
    今は自信云々より最初に行っていたリンカの代わりに自分の手でリンクしてみたいと再度思い、様々なサイトを転々としています。センスがないだけに一向にいい情報は見つかりませんが。
    rubato6809さんは私が愚人なだけに厳しい言い方などをされますが、私のような人間の思考を読み取って適切にアドバイスを頂けるため大変感謝しております。
    どうもありがとうございます。

    キャンセル

  • 2018/03/17 11:55

    あのチロリアンさんにご質問なのですが、AVRマイコンに実行ファイルを書き込む際に、リンカが必要となりますが、AVRマイコン規模ならば、自分の手でオブジェクトファイルをリンクできると思います。

    キャンセル

  • 2018/03/17 12:05 編集

    catsforepawさん、yukkeorgさん。
    なるほど、そうでしたか。その可能性も疑ったのですが裏を取れなくて。ざっと処理能力を計算して1/4縮小とかすればありえない話ではないと思いましたが、やっぱりそうですよね。 ソースまで確認頂きありがとうです。

    > カメラの向きを変える程度のモーター制御なら、8bitマイコンでも余裕でできるでしょう。
    ですよね。私もAVRに期待するのはその辺です。

    キャンセル

  • 2018/03/17 12:14

    carnage0216さん。
    > AVRマイコン規模ならば、自分の手でオブジェクトファイルをリンクできると思います。
    可能か不可能かという意味では可能ですよ。意味があるかないかという問いなら意味はありません。
    まずは実際にツールを使って各ツールがどのような振る舞いをするのかを確認しないことには話にならないと思います。
    そして、もし、それぞれのツールの出力フォーマットの資料があれば、それらが出力したデータの16進ダンプをみてその構造を把握するのは有用な場合があります。(そのようなツールを開発したい人の場合など。)

    ところで、私は「ケイロニアン」と読みます。読みにくくて申し訳ない。

    キャンセル

  • 2018/03/17 12:38

    名前を間違えるなど、大変無礼なことをしました。すいません。
    解説と解答ありがとうございます。ケイロニアンさん。

    キャンセル

  • 2018/03/17 14:06

    画像処理はPC側だったんですね。
    動画自体が早送りになっていることを少し疑っていましたが。

    キャンセル

  • 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 16:49

    はい。出直してきます。
    どうもありがとうございました。

    キャンセル

  • 2018/03/17 17:25

    あの、最初の質問とは全然異なりますが、簡単なアセンブリプログラムなのですが、もともとは3つのアセンブリプログラム(Ⅽからコンパイルしたプログラム)を一つにまとめて、メモリの使い方やアドレスを指定したり工夫した使い方をしたところリンカを使わずに実行ファイルが得られました(参考サイトのやり方をまねたりコピペもしましたが...)。
    日ごろの行いゆえに信じてもらえるかわかりませんが。あるいはリンカを使っているけど私の技量不足ゆえにリンカを使っているけど勘違いして使っていないと思っているだけかもしれませんが。
    こんなことってあり得るかはわかりませんが、とりあえずリンカを使わないでアセンブリプログラムの命令などの工夫だけでなんとかできました。これからはリンカを利用しないでアセンブリ言語でソースコードを作れるように頑張ってみます。
    皆さんのおかげで少しずつアセンブリ言語の習得と工夫の仕方がわかりました。
    でも凄くうれしいです。リンカを使うことなく実行ファイルが得られたのは。
    本当にどうもありがとうございました。いったん質問はやめます。
    もっと技量をつけたら来ます。
    では失礼いたします。

    キャンセル

  • 2018/03/17 17:49

    > あるいはリンカを使っているけど私の技量不足ゆえにリンカを使っているけど勘違いして使っていないと思っているだけかもしれませんが

    恐らくこの見解が正しいだろうと思います。cコンパイラと考えているものは一般には実はコンパイラではなくコンパイラ・ドライバと呼ばれるツールです。与えられたパラメータに従ってプリプロセッサ→コンパイラ→アセンブラ→リンカを次々と呼び出すのと同じイメージで動作します。ですので、リンカも暗黙的に呼ばれている可能性が高いです。

    キャンセル

  • 2018/03/17 17:51

    残念です。でも少しずつですがプログラムは簡単なものなら書けるようになってきました。
    ケロリアンさん。どうもありがとうございます。

    キャンセル

  • 2018/03/17 17:54

    ちなみに、くどいようで申し訳ないのですが、アセンブリプログラムやバイナリ、機械語などを熟練した人ならリンカを利用しないで実行ファイルが得られるのではないでしょうか?

    キャンセル

  • 2018/03/17 18:12

    いえ、それだけではとてもとても無理です。対象環境の実行可能形式ファイルのフォーマットも把握している必要があります。linuxやWindowsの場合、このフォーマットの把握に必要な知識は膨大な量になります。
    しかし、OS配下でない場合は、それらの膨大な知識はほとんど不要です。

    > もともとは3つのアセンブリプログラム(Ⅽからコンパイルしたプログラム)を一つにまとめて、メモリの使い方やアドレスを指定したり工夫した使い方をしたところリンカを使わずに実行ファイルが得られました

    そのコードにはスタートアップ・ルーチン(https://goo.gl/wzabH1)が含まれていないことは確実ですが、実行可能形式ファイルには必須ですのでリンカが自動的にリンクします。更にスタートアップ・ルーチン以上に複雑な多数の約束事がありますが、その約束事に従ったデータをリンカが自動的に生成してくれます。その辺りの知識がないととても作れないのです。

    ところで、私は「ケイロニアン」と読みます。読みにくくて申し訳ない。

    キャンセル

  • 2018/03/17 18:14

    勉強することがたくさんありそうです。どうもありがとうございました。
    ごめんなさい。ケイロニアンさん。

    キャンセル

  • 2018/03/17 18:21

    アセンブラのみで実行ファイルを作るのはアセンブラ次第では不可能ではない
    ただし、GNUアセンブラ(as)では無理

    https://github.com/nalsakas/pe
    https://github.com/corkami/pics/blob/master/binary/elf101/simple.asm

    キャンセル

  • 2018/03/17 18:27 編集

    例外もあるようですね。今GNUアセンブラを調べたのですが、NASMあるいはMASMならばアセンブラ次第でリンカを使わなくてもいいようですね。
    asmさん、資料提供どうもありがとうございます。

    キャンセル

  • 2018/03/17 18:28

    早速、試してみます。

    キャンセル

  • 2018/03/17 19:14

    よくよく考えたらGCCにはアセンブラが含まれているので、GCCでもアセンブラ次第でリンカを使わないで実行ファイルが得られるかもしれませんね。

    キャンセル

  • 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 15:17

    するために、質問しています。丸投げなどはしておりません。
    そう感じさせてしまったならば私に非があります。
    すいませんでした。

    キャンセル

  • 2018/03/16 15:22

    丸投げはしていない、というなら、今まであなたはこれのためになにを調べ、なにをやったか質問に追記してください。
    最初の質問から見てるけど、あなたは愚にもつかん理屈こねながら口先だけでグダグダ言ってるだけじゃないですか。
    ちゅーがくせーかこーこーせーか(もしかしたらしょーがくせー?)知らないけど、えーかげんにしよーよ。

    キャンセル

  • 2018/03/16 16:21

    どのようなものを見るべきかもわからないから本当にわからないというものでして、なんとか知りたいということで質問をするのは良いことかと思います。

    ある程度わからないと質問もできない雰囲気というのは誰も得しないので許してあげてください。

    ただ、質問されていることはだいぶ特殊であることを質問者の方も自覚するべきかと思います。

    質問サイトは限られた疑問を尖った形でしか解決できません。
    一度体系的に学ばれたらいかがでしょうか?

    このようなものとか無料でも学べますので。
    https://www.coursera.org/learn/comparch
    https://www.google.co.jp/amp/s/hackr.io/tutorials/learn-assembly-language/amp

    質問を理解する前提の知識を持っていないと、どこから説明すれば良いのかもわかりません。
    分野によってはそのようなことはひどく嫌われます。

    キャンセル

  • 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の方でアセンブリ変換して読んでみます。

    キャンセル

同じタグがついた質問を見る

  • C++

    4423questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Arduino

    672questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

  • アセンブリ言語

    116questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

  • CPU

    52questions

  • リンカ

    7questions

    リンカはコンパイルされたオブジェクトコードに、必要なライブラリなどを付け加えて、実行可能ファイルを生成するプログラムです。コンパイルされたオブジェクトのコードを複数のファイルで取得し、"linked"という一つの実行可能のファイルを生成します。

  • トップ
  • C++に関する質問
  • オブジェクトファイルを自分の手でリンクして実行ファイルにしたい。(リンカを使わないで行いたいです。)