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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Q&A

解決済

5回答

836閲覧

バイナリファイルのメモリ番地が決定するタイミングはいつですか?

yuta.k

総合スコア23

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

0グッド

1クリップ

投稿2019/09/01 11:01

前提

・プログラミングではなく、コンピュータの仕組みに関する質問です。

質問

・バイナリファイルのメモリ番地が決定するタイミングはいつですか?

詳細

■背景
・linux上で/bin/lsを逆アセンブルしました。
・結果、ネイティブコードの横にメモリ番地が指定されていることを確認しました。(3758, 375cなど)

root@654efdae0005:/# objdump -d -M intel /bin/ls | head /bin/ls: file format elf64-x86-64 Disassembly of section .init: 0000000000003758 <_init@@Base>: 3758: 48 83 ec 08 sub rsp,0x8 375c: 48 8b 05 7d c8 21 00 mov rax,QWORD PTR [rip+0x21c87d] # 21ffe0 <__gmon_start__> 3763: 48 85 c0 test rax,rax

・ネイティブコードが生成された時点でメモリ番地が割り当てられる、と仮定すると以下のようなデメリットがあると思います
1)実行されないコードだとしても、ネイティブコードがコンパイルされる度にメモリ空間が使用されてしまう

・私の仮説は以下です
1)全てのネイティブコードにメモリ番地が指定されている訳ではなく、/binに配置されていることに関係している

■備考
teratail初利用です。
質問の仕方など至らぬ点はご指摘いただけますと嬉しいです。
以上どうぞよろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

・ネイティブコードが生成された時点でメモリ番地が割り当てられる、と仮定すると以下のようなデメリットがあると思います

1)実行されないコードだとしても、ネイティブコードがコンパイルされる度にメモリ空間が使用されてしまう

システムによって、このあたりの対応はまちまちです。

  • CP/Mのような古いシステムの場合→プログラムを置く番地が決まっているので、同時に1つのプログラムしか実行できない
  • 仮想記憶があるので、プログラムから見ればいつも同じメモリアドレスに見える(けど物理的には異なる)
  • 実行前にローダがメモリアドレスを書き換える
  • 相対アドレスで書かれているので、メモリのどこに置いてももとから正常動作する(位置独立コード

この内後半2つの、「メモリ内で再配置可能なコード」のことをリロケータブルコードと呼びます。

投稿2019/09/01 11:35

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/09/01 12:06

細かな説明どうもです。 ただ、最近のOS(Linux, Windows)では、 ほぼ、2番目の仮想記憶じゃないかと思いますが、どうでしょう。
maisumakun

2019/09/01 12:10

共有ライブラリでは位置独立コードの技法も現役なほか、セキュリティ面(実行のたびにメモリアドレスを変えることで攻撃しにくくする)の理由で実行ファイルを位置独立にする例もあるとのことです。
sage

2019/09/04 08:20

今でもハード/OSとも開発が続いている汎用機(z/OS等)では(コンパイルされた)バイナリプログラムはリロケータブルプログラムで、実行プログラムを主記憶にローディングする際にアドレスが決定されます。プログラム中のアドレス定数にはOSのloaderがプログラムをloadして実行を渡す前に、loadされたアドレスに基づく仮想アドレスを(loaderが)設定します。
guest

0

ベストアンサー

1)実行されないコードだとしても、ネイティブコードがコンパイルされる度にメモリ空間が使用されてしまう

プログラム(OSから起動する単位)は、それぞれ別々のメモリ空間で動きます。
同じプログラムを複数同時に動かすと、それぞれ別のメモリ空間の同じ論理アドレスで動きます。

ということで、

・ネイティブコードが生成された時点でメモリ番地が割り当てられる、と仮定すると

という仮定が正しいです。物理メモリ番地じゃなくて論理メモリ番地ですが。

もし、仮想記憶について知らなければ調べましょう。

投稿2019/09/01 11:18

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/09/01 11:59

共用ライブラリ(Linuxの~.soとか、Windowsの~.DLLとか)は、どの論理アドレスにロードされるか作成時に決められないので、ロード時に論理アドレスが決まります。
sage

2019/09/03 16:25

otnさんが慣れ親しんだOSはそうかもしれませんが、私が慣れ親しんだOS(windowsやLinuxではありません)ではプログラムは任意の論理アドレスに読み込まれても動作するように作成します。OSの中でも凄く特殊なプログラム(OSの初期化の中の一部プログラム)以外、プログラムは通常relocatableで作成されており、メモリに読み込まれる時点でアドレスが決まります。
guest

0

最近のPC(OS)では、仮想記憶で動いているので、ほぼ、otnさんの回答で良いと思います。 (実アドレス ≠ 論理アドレス)

ただ、昔のCPUでは、全て相対ジャンプで動くコードもあったので、その場合はメインメモリにプログラムがロードされた時です。そこでは、メインメモリの空いているアドレスにプログラムがロードされ、(一定のメモリ空間が確保され) そこからジャンプ/サブルーチン呼び出しが行われます。
今のPC(CPU)でそんなコードが書けるかは知りませんが、参考までに。

投稿2019/09/01 11:36

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

OS次第ではありますが、概ねプログラム起動時ですね。

プロセス空間という言葉で調べると良いと思います。

投稿2019/09/01 12:00

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

・私の仮説は以下です

間違ってますね。
ネイティブコードについてはすべて、実行ファイル生成時点で決定されます
データのアドレスについては、動的に確保される領域は実行時に決定されます。が、静的な領域は実行ファイル生成時点でアドレスが決定されます

まあ、PCなんかでは仮想記憶になってるので、論理アドレスが決定される、という形になり、物理アドレスはどこに割り当てられるかは、OSの気分次第となりますが。

投稿2019/09/01 11:05

編集2019/09/01 11:13
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/09/01 12:45 編集

高評価しましたが、「すべて」というところが間違っているので戻しました。低評価まではしていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問