リンカ・ローダと実行形式
オブジェクトファイルとELF形式、シンボル解決と再配置、静的リンクと動的リンク、プロセスのメモリ配置を3択問題で学べます。
—あなたの正答率
0 / 50解いた問題
リンカ・ローダと実行形式の要点
コンパイラが出力するのは、そのままでは実行できないオブジェクトファイルです。リンカは複数のオブジェクトファイルやライブラリを集め、関数や変数の名前(シンボル)を実際のアドレスに結びつけ(シンボル解決)、そのアドレスを命令に書き込んで(再配置)、実行ファイルをつくります。
ローダは実行ファイルをメモリに読み込み、テキスト・データ・BSS・ヒープ・スタックの領域を整えてプログラムを開始します。ライブラリを実行時に結びつける動的リンクや、どのアドレスに置いても動く位置独立コード(PIC)は、メモリの節約とセキュリティの両方に役立っています。
リンカ・ローダと実行形式の問題一覧(50問)
- コンパイラが1つのソースファイルから出力するオブジェクトファイル(.o)について正しいものはどれか。
- リンカの主な役割として正しいものはどれか。
- リンカが行うシンボル解決の説明として正しいものはどれか。
- リンカが行う再配置(リロケーション)の説明として正しいものはどれか。
- C言語のプログラムをリンクしたときに「undefined reference to `foo'」(fooへの未定義の参照)というエラーが出た。最も考えられる原因はどれか。
- a.cとb.cの両方で、static を付けない同じ名前のグローバル関数 void init(void) を定義してリンクした。起こることとして正しいものはどれか。
- C言語で関数にstaticを付けて定義したとき(例: static int helper(void))の効果として正しいものはどれか。
- C言語で「extern int count;」と書いたときの意味として正しいものはどれか。
- Linuxなどでよく使われるELF形式のファイルについて正しいものはどれか。
- 実行ファイルの.textセクションに入っているものはどれか。
- C言語でファイルの外側に「int limit = 100;」と書いたグローバル変数は、一般にどのセクションに置かれるか。
- .bssセクションの特徴として正しいものはどれか。
- C言語の「char *p = "hello"; p[0] = 'H';」を実行すると、多くの環境で異常終了する。その理由として正しいものはどれか。
- 上のグローバル変数のうち、一般に.bssセクションに置かれるものの組み合わせはどれか。
- C言語の関数の中で宣言した、staticの付かない局所変数(自動変数)は、実行中どこに置かれるか。
- C言語のmallocで確保したメモリは、一般にプロセスのどの領域から取られるか。
- Linuxなどの一般的なプロセスのメモリ配置を、番地の小さい方から並べたものとして正しいものはどれか。
- プロセスのヒープとスタックを、間に広い空きをはさんで反対向きに伸ばす配置にする利点として正しいものはどれか。
- 静的リンクの説明として正しいものはどれか。
- 動的リンク(共有ライブラリ)の利点として正しいものはどれか。
- 動的リンクを使ったプログラムを別のコンピュータにコピーして実行したら、起動しなかった。最も考えられる原因はどれか。
- 静的ライブラリ(.aファイル)と一緒にリンクするとき、リンカが実行ファイルに組み込むものとして正しいものはどれか。
- GNUのリンカで「gcc -lmylib main.o」のように、静的ライブラリをそれを使うオブジェクトファイルより前に書くと、未定義の参照のエラーになることがある。その理由として正しいものはどれか。
- 位置独立コード(PIC)の説明として正しいものはどれか。
- 共有ライブラリで使われるGOT(グローバルオフセットテーブル)の役割として正しいものはどれか。
- 動的リンクで、PLT(プロシージャリンケージテーブル)を使った遅延束縛(レイジーバインディング)を行う場合の説明として正しいものはどれか。
- Linuxで動的リンクのプログラムを起動するときに働く動的リンカ(ld.soなど)の役割として正しいものはどれか。
- ASLR(アドレス空間配置のランダム化)の目的として正しいものはどれか。
- 実行ファイルをPIE(位置独立実行ファイル)として作る主な理由はどれか。
- プログラムを起動するとき(Linuxのexecveなど)に、OSのローダが行うこととして正しいものはどれか。
- C言語のプログラムで、OSが最初に実行を始める番地(エントリポイント)について正しいものはどれか。
- C言語のmain関数が「return 3;」で終わったとき、その値3は一般にどうなるか。
- 実行ファイルにstripコマンドを使ったときに起こることとして正しいものはどれか。
- リンカでの弱いシンボル(weak symbol)の扱いとして正しいものはどれか。
- C++のコンパイラが関数名に引数の型などの情報を付け加えてシンボル名を作る「名前修飾(マングリング)」の主な目的はどれか。
- Linuxのdlopen関数(WindowsのLoadLibraryに相当)の使い道として最も適切なものはどれか。
- 100個のプロセスが同じ共有ライブラリを使っているとき、物理メモリの使い方として正しいものはどれか。
- オブジェクトファイルを逆アセンブルすると、外部の関数printfを呼ぶ命令の飛び先が0のように仮の値になっていた。この値はいつ正しく埋められるか。
- 組込み向けの開発で使うリンカスクリプトの役割として正しいものはどれか。
- OSのないマイコンで、電源を入れた直後に起動コードがmainを呼ぶ前に行う処理として正しいものはどれか。
- ELFのファイルにおける「セクション」と「セグメント」の違いとして正しいものはどれか。
- メモリのページに「書き込み可能」と「実行可能」を同時には許さない(W^X、書き込みと実行の分離)ことで防ぎやすくなる攻撃はどれか。
- Linuxの共有ライブラリで、libfoo.so.1の「.1」のようなsonameのバージョン番号を上げるのは、一般にどのようなときか。
- Linuxでlddコマンドを実行ファイルに使うと分かることはどれか。
- 主なOSで使われる実行ファイルの形式の組み合わせとして正しいものはどれか。
- 再帰が深くなりすぎてスタックの上限を超えたとき、Linuxなどで一般に起こることとして正しいものはどれか。
- C言語で、初期値を書かない局所変数とグローバル変数の、使い始めたときの値について正しいものはどれか。
- mallocとfreeを繰り返すうちに、空きメモリの合計は十分あるのに、大きな領域をまとめて確保できなくなることがある。この現象を何と呼ぶか。
- 共有ライブラリを作るとき、外から使う関数だけを公開し、内部の関数はシンボルの可視性(visibility)を「hidden」にする利点として正しいものはどれか。
- C++でグローバルなオブジェクトのコンストラクタがmainより前に実行されるしくみとして正しいものはどれか。