_alloca


スタック伸張のためにgccが自動的に呼ぶ。恐らく回避不可能。

実例

_allocaが呼ばれない例

int test() { char a[3800]; a[0] = 0; }
	pushl	%ebp
	movl	%esp, %ebp
	subl	$3816, %esp
	movb	$0, -3816(%ebp)
	leave
	ret

_allocaが呼ばれる例

int test() { char a[4000]; a[0] = 0; }
	pushl	%ebp
	movl	%esp, %ebp
	movl	$4008, %eax
	call	__alloca
	movb	$0, -4008(%ebp)
	leave
	ret

実装

スタックがページ例外時に自動伸張されるという前提で、_allocaは以下のように定義すれば良いかも?

__alloca:
	pop	edx
	sub	esp,	eax
	jmp	edx

Monaへ_alloca手順

  1. src/lib/monapi/_alloca.asm
    bits 32
    %include "macro.asm"
    cexport _alloca
    section .text
    _alloca:
    	pop	edx
    	sub	esp,	eax
    	jmp	edx
    • ビルドしてみると _allocaがリンクエラーに。monapi_impl.aに_alloca.oも含めているのになぜだろう?
    • monapi_impl.aに__allocaといシンボル名が入っていない。(バイナリエディタで文字列検索しました。)
    • src/kernel/core.asmと記述を見比べてみると、section .textの記述を忘れていた
  2. リンクエラーを解決してMona上で実行してみると、シンボルが見つからずリンクエラーっぽい。
  3. ということは、DLLに_alloca.oの中身がはいっていないか、シンボル名がおかしくなっているかと判断。
  4. ということでバイナリエディタで DLL の中身を調べるのと同時に、 nasmで生成した*.oをDLLに含める場合の ld との相性問題があるかもしれないのでぐぐろう。
  5. ↑の方針を決めたところで寝ました。

まとめ

DLLにアセンブラのソースを含める手順

  1. global指定
  2. export指定(PE特有)
    • プレフィックスのアンダーバーは付けません。
      【例】
      global _test
      export test
    • MonaではELFとの兼ね合いがあるのでマクロを定義してcexport testで一括処理
  3. コードはsection .textに記述する
    【例】
    section .text
    _test:
    	ret

注意事項

コメント

コメントはありません。 コメント/_alloca?

お名前:

MENU

now: 2

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3511, today: 2, yesterday: 0

添付ファイル: fileMona-20050620-_alloca.diff 1403件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3857d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.046 sec.