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

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

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

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

Q&A

解決済

3回答

3580閲覧

ELFの関数プロローグについて

Divided_by_Zero

総合スコア42

C

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

1グッド

1クリップ

投稿2016/01/29 05:34

Ubuntu 12.04.1 LTSで実行ファイルをgccを用いて作成し、逆アセンブルしたところ、気になる箇所があったので質問させていただきます。(申し訳ないのですが、アセンブラのタグが見つけられなかったので、C、GCC、GDBというタグをつけさせていただきました。)

環境は以下のとおりです。

$ uname -a Linux tukejonny-virtual-machine 3.2.0-97-generic-pae #137-Ubuntu SMP Thu Dec 17 21:37:53 UTC 2015 i686 i686 i386 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 12.04.1 LTS Release: 12.04 Codename: precise $ gcc --version gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

この環境で以下のようにC言語のソースコードを作成し、そのファイルをgccでコンパイルしました。

hige@piyo:~$ cat hello.c #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; } hige@piyo:~$ sudo sysctl -w kernel.randomize_va_space=0 kernel.randomize_va_space = 0 hige@piyo:~$ gcc -fno-stack-protector -z execstack -o hello hello.c hige@piyo:~$ ls -l hello-rwxrwxr-x 1 hoge hoge 7159 1月 29 14:16 hello

gdbでmain関数の部分を逆アセンブルすると、

hige@piyo:~$ gdb -q ./hello (no debugging symbols found)...done. gdb$ disas main Dump of assembler code for function main: 0x080483d4 <+0>: push ebp 0x080483d5 <+1>: mov ebp,esp 0x080483d7 <+3>: and esp,0xfffffff0 <- ? 0x080483da <+6>: sub esp,0x10 ... End of assembler dump.

push ebp; mov ebp, esp; sub esp, 0x10;
という命令列は、関数エピローグとして紹介されたことがあったので知っていたのですが(old ebpをスタックにpushし、espの値をebpに移送、espから10進数だと16を引くことでその関数のローカル変数領域を確保する)、and esp, 0xfffffff0という命令がありますが、これは何を意味しているのでしょうか?

ぱっと見では、espと0xfffffff0の値の論理積を取り、その値をespに格納しているようですが、関数プロローグの一部として、この命令がどういった意味を持っているのかがわかりません。

初歩的な質問でお恥ずかしい限りですが、どなたかご教授いただけないでしょうか?

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

GCC Bugzilla Gcc misaligns arrays when stack is forced follow the x8632 ABI によれば、「明文化されていないものの、x86/x64 ABI(Application Binary Interface)仕様によって、スタックポインタ(esp/rsp)の16バイトアライメントが要求されている」そうです。

**追記:**外部サイト(Qiita)に スタックフレームのアライメント要件 として整理しました。

投稿2016/01/29 13:05

編集2016/01/30 05:18
yohhoy

総合スコア6191

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

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

Divided_by_Zero

2016/02/07 16:03

連絡が遅れてしまって申し訳ないです Qiitaの記事としてまとめてくださってありがとうございます。 ずっと気になっていたのですが、パフォーマンス、慣習的なもの込みでの実装だったのですね。 アライメントが、挙動が変化するような関わり方をしているかもしれないと思ったのですが、処理速度と関係していたとは・・・ 大変勉強になりました。
guest

0

espを16バイト境界にアライメントしています(gccはデフォルトでそうするようですが、詳しい理由はわかりませんでした)。

投稿2016/01/29 05:55

maisumakun

総合スコア145183

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

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

0

http://news.mynavi.jp/column/architecture/119/
itanium アーキテクチャーでは、1命令ブロックに3命令がパックされるとあり、その大きさが128ビット、16バイト。16バイト整合させる理由は、、、、

http://d.hatena.ne.jp/tomitake_flash/20100411/1270996605
スタックアンダーフロー防止用のコードが入る領域の確保に16バイト取ってる、?

最初は、命令の最大長が15バイトだから、と思ったんですが違うみたいです。

投稿2016/01/29 08:17

ipadcaron

総合スコア1693

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問