する質問をすることでしか得られない、回答やアドバイスがある。18ELFファイルのレイアウトとそのメンバについてわからないことがあります。a.outでELFの情報を出したものです。Headersのところには、プログラムヘッダの一覧が出ています。Elf64_Phdr;プログラムヘッダを表現する構造体は上記です。先ほどのCプログラムを実行した時の/proc/pid/mapsの出力を見てみると以下のようになっています。ASLRを無効化してコンパイルしてあります)わからないことの1つ目なのですが、Elf64_Phdrのメンバであるp_vaddrは、manページによるとセグメントの先頭バイトがある仮想アドレスを保持しているはずです。図1の上から4番目のLOADタイプのセグメントはDATAセグメントだと思われます。そのp_vaddrは0x0000000000600e10となっていますが、図2の3行目では開始アドレスは0x006010000となっており、ELFファイルが保持する情報と一致していないように思われます。図1の上から3番目のLOADタイプのTEXTセグメントと思われるセグメントのp_vaddrは0x0000000000400000となっていますが、図2の一行目の開始アドレスは0x00400000となっており、こちらは一致しているように見えます。これはなんなのでしょうか?2つめですが、セグメントの位置と大きさについてです。メモリ上のセグメントサイズを表すp_memszは0x230となっています。すると、データセグメントの終了アドレスは以下のようになると思います。0x230ですが、文字通りにとれば、DATAセグメントが0x0000000000601040で終わるとすると、その下のDYNAMICセグメントの開始アドレス0x0000000000600e28と被ってしまうはずです。ELFはどのようにメモリにロードされているのでしょうか?よろしくお願いします。attachmentクリップ2気になる質問をクリップするクリップした質問は、後からいつでもマイページで確認できます。クリップした質問に回答があった際、通知やメールを受け取ることができます。自分も答えを知りたい質問者以外のユーザにも役立つ評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。質問の評価を上げたことを取り消します低評価-評価を下げられる数の上限に達しました評価を下げることができません1日5回まで評価を下げられます1日に1ユーザに対して2回まで評価を下げられます質問の評価を下げるteratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。コメントをしてください。送信する質問の評価を下げる機能の利用条件この機能を利用するためには、以下の事項を行う必要があります。件sort評価が高い順sort新着順sort古い順linkcheckベストアンサー01つ目の質問ですが、実メモリ上のdataセグメントの開始アドレスは、ldで使われるデフォルトのリンカースクリプトの指定で並べ替えられているようです。こちらのブログの記事を読ませていただいて、分かり易かったので案内させていただきます。--verboseでリンカースクリプトを確認したところ、全内容の精査まではしていないものの、それっぽくなっていました。間違いですよね?)これはOracleのサイトでのELFの説明(ただし、Solaris/SunOS用)にヒントとなる記述がありました。Address」の節で、以下の記述があります。obtain...の文で「メモリアドレスの最大のページサイズの倍数に切り捨てることでベースアドレスを取得できる。値に合致しない」とのことです。linuxのページサイズは4KiB(0x1000)なので、その倍数単位でベースアドレスになっていることに合致します。layout.との記述があります。64ビット版そのものではないですが、メモリ上にセグメントを割り当てる上でページサイズは意識せざるを得ないでしょうから、ELF形式の実行ファイルのローダーの挙動として参考になるかと思います。0x00601000なのかと言えば、リンカースクリプトでそのように指定しているから、と言うことが言えるかと思います。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。回答ありがとうございます。アドレスの決定はリンカーが深く関与しているということですね。ローダがどのように配置するか知りたく、いっそのことカーネルのコードを見てしまえと思ったので読んでみることにしました。リンカスクリプトも少しいじってみようと考えています。ありがとうございました。回答ありがとうございます。アドレスの決定はリンカーが深く関与しているということですね。ローダがどのように配置するか知りたく、いっそのことカーネルのコードを見てしまえと思ったので読んでみることにしました。リンカスクリプトも少しいじってみようと考えています。ありがとうございました。キャンセル完了するlink0読み込み方だけについてならばTypeがLOADになってるこの場合2つだけ見ます。0x006010000の属性が書き込み不可なのだけ引っかかりますが後ろで宣言されてるGNU_RELROによって属性が上書きされてるのかもしれませんねその下のDYNAMICセグメントの開始アドレス0x0000000000600e28と被ってしまうはずです。FILEオフセットを計算すると同じ場所を示しています。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。11:16回答ありがとうございます。FILEオフセットを計算すると同じ場所を示しています。セグメントのp_offsetとp_vaddrはそれぞれファイル内で格納されている場所と実際にメモリにロードされる場所であり、それらは関係がない(お互いに影響を与えるものでない)と思っていたのですが、p_vaddrとp_offsetの関係はどうなっているのでしょうか?また、セグメントはPT_LOADタイプだけがメモリにロードされるということを思い出しました。自分でも混乱してよくわからないのですが、ではなぜ、ロードされないPT_NOTEやPHDRにもp_memszやp_vaddrなどの属性の値が指定してあるのでしょうか?リンカの都合でしょうか?回答ありがとうございます。FILEオフセットを計算すると同じ場所を示しています。セグメントはPT_LOADタイプだけがメモリにロードされるということを思い出しました。0xe28で同じ位置から読み込んでいます。PT_LOADタイプで読み込んで、その他のタイプのセグメントによって用途をOS等に伝えている。それだけだと思いますよ。p_memszやp_vaddrVAおよびファイルオフセットどちらからでもアクセスできるようにだと思いますよ他のツールから特定セグメントのみ閲覧したい場合もありますし、PT_LOADの場合よりもわざわざ情報量を減らすメリットもなさそうです。同じ位置から読み込んでいます。PT_LOADタイプで読み込んで、その他のタイプのセグメントによって用途をOS等に伝えている。それだけだと思いますよ。他のツールから特定セグメントのみ閲覧したい場合もありますし、PT_LOADの場合よりもわざわざ情報量を減らすメリットもなさそうです。12:20ありがとうございました。ありがとうございました。解決済VS2015C++でwinsock,OpencvによるTCP画像送信プログラム受付中リンカの働き、アセンブリプログラムをアセンブルにより機械語に変換する。数値の先頭が0か判定したいです。頂いたご意見への回答は行っておりません。