Linker && Loader
■ このスレッドは過去ログ倉庫に格納されています
0001さとし ◆k4PcAe16
NGNG難しいような気がするんですが。。。
僕もリンカとローダを作れるようになれますか?
0191162
NGNG>>>185にメモリが無駄になるって書いてあるじゃん。
それは分っています。ローダーがページ境界に収まるように
DYN内の.non-pic.text(仮)セクションをメモリ内にコピー&アドレス値を
上書きすることでは、それ程無駄になら気も。気のせいかな。。。
ただ、CoWとは言っても、実行が開始される前のdynamic linkerが
コード内のアドレス値を書き換える時点において、ページが割り当てられて
しまうんですね。当たり前ですが。そのコードが実行されるかどうかに関係なく。
最近のOSならばページフォルトを利用したVMMによるファイルの遅延ロードは
どれも実装されていると思いますので、下手したら、静的リンクよりも
効率の悪いものになるかも?!
>実際、関数呼び出しがあるページがコピーされたら、
>プログラムの領域はほぼ全部コピーされちゃうんじゃない?
これはどういう意味ですか?できればもう少し詳しくお願いします。
先にPICなセクションを再配置しておいてから、non-PICなセクションを
処理すれば、あまり問題がないような。
DYNにnon-PICなコードを含めるのならば、セクションを別にする必要が
あるだろうと思います。
不勉強なのに適当な印象の話ばかり書き込みました。しばらくELFと
dynamic linkerについて調べてきます。
0192156
NGNGちょうどcygwinでi386のelfを吐けるクロスコンパイラをビルドしたところだったので
試しにやってみたらnon-PICなrelocatableからsharedを作れました。
# ていうか最初に試せ >俺
>>142の人がどういう手順と環境で出来なかったのか気になります……。
0193デフォルトの名無しさん
NGNGおお、それはGOODニュースですね!
で、できればリンカオプションを教えてください・・・orz
0194162
NGNG$gcc -c -fomit-frame-pointer -o foo.o
$ld -o foo.so -shared foo.o
$objdump -d foo.so
000002b8 <foo>:
2b8: 83 ec 04 sub $0x4,%esp
2bb: a1 c8 12 00 00 mov 0x12c8,%eax
2c0: 89 04 24 mov %eax,(%esp,1)
2c3: 83 c4 04 add $0x4,%esp
2c6: c3 ret
なんか今まであれこれ憶測並べてたのが恥かしくなってきた。
もう寝る。。
0195156
NGNG> DYNにnon-PICなコードを含めるのならば、セクションを別にする必要がある
まるっきり勘で言いますけど、普通別にしないような気がします。
まあ勘なんでなるたけ突っ込まないで下さい。
あと細かい点ですが、実行時の視点で見るのはセクションでなくセグメントです。
ELFの場合この用語は混同しない方が良いです。
>>194
すんません、普段ELFを作れる環境を使わなかったんで……。
Sunのサイトで公開されてるSolarisのマニュアルにリンカに関する物があって、
それにELFの仕様の邦訳っぽい物も含まれてます。
所々微妙な訳もありますけど、一応メンテナンスはされてるようなんで
英語がとっつき辛い場合はそれも参考にすると良いかもしれません。
0196デフォルトの名無しさん
NGNG0197鬼塚先生
NGNG0198デフォルトの名無しさん
NGNGそれはGTO。
0199デフォルトの名無しさん
NGNGld -T boot.ls -o boot boot.o
したら
ld: PE operations on non PE file.
というエラーになって生成できません。
AMD k6-2のLinuxではちゃんとブートセクタが生成されて動作できました。
Cygwin版特有のオプション等が必要なんでしょうか?
解決方法を教えて下さい。
よろしくお願いいたします。
boot.ls
-----------------
OUTPUT_FORMAT("binary");
MEMORY
{
body : org = 0, len = 510
sign : org = 510, len = 2
}
SECTIONS
{
.text : { *(.text) } > body/* executable code */
.rodata : { *(.rodata*) } > body/* constants */
.data : { *(.data) } > body/* initialized data */
.bss : { *(.bss) } > body/* uninitialized data */
.sign : { SHORT(0xAA55) } > sign/* boot signature */
}
0200デフォルトの名無しさん
NGNGboot.oはどうやって生成した?
0201199
NGNGMakefileの内容です。
all:
gcc -Os -c -o img/boot.o boot.s
ld -T img/boot.ls -o img/boot img/boot.o
gcc -Os -c -o img/kernel.o kernel.c
ld -T img/kernel.ls -o img/kernel img/kernel.o
dd if=img/my_default.img of=img/my.img 2> /dev/null
dd if=img/boot of=img/my.img conv=notrunc 2> /dev/null
dd if=img/kernel obs=512 seek=1 of=img/my.img
0202デフォルトの名無しさん
NGNGどっちかだと思ったんだよな。
ldのメッセージは前者っぽいんだけど
gccがcygwinネイティブなら後者かなー。
今携帯からなんでPEのリファレンスがねーのよ。
0203199
NGNGばいなりエディタでboot.oを各環境とも開いてみたらLinux側は先頭に
.ELF
があって、Cygwin側の先頭は
L<
text
って感じでした。
自分ではこれが何を意味しているか分からないですが参考までに。
よろしくお願いいたします。
0204デフォルトの名無しさん
NGNGリンカスクリプトのboot.lsが元のオブジェクトファイルの中から
.textセクションとか.rodataセクションを抜きだして
(セクション構造のない)ベタなbinaryにしようとしてるわけだけど、
このセクション構造がELFにあってPEにないもので、
cygwinで作ったバイナリがPEなもんだから
ldが処理できませーんとかになってんじゃないのかなみたいな
0205デフォルトの名無しさん
NGNGして詳細メッセージ出したのをはってもらえない?
0206199
NGNG$ ld -v -T img/boot.ls -o img/boot img/boot.o
GNU ld version 2.15.91 20040725
ld: PE operations on non PE file.
0207199
NGNG$ ld -V -T boot.ls -o img/boot boot.o
GNU ld version 2.15.91 20040725
Supported emulations:
i386pe
ld: PE operations on non PE file.
となりました。
0208デフォルトの名無しさん
NGNGhttp://my.execpc.com/~geezer/embed/bugs.htm#mingbug
0209デフォルトの名無しさん
NGNG超簡単なmsvcrtの関数使うサンプルとかないですかね?
そういや市販コンパイラが作るDLL関数の呼び出しコードって
インポートテーブルから
call DWORD ptr[import_table_address]
のようなことしてるけど、別に
mov eax, procedure_addres
call eax
としてもいいよなあ。
なんで1段参照増やしてんの?
インポートテーブル分無駄じゃない?
0210デフォルトの名無しさん
NGNGなるほどねー。
0211デフォルトの名無しさん
NGNGの各DLL関数名の前に付いている、
「ヒント」の値って、何を入れるんでしょうか?
意味がまるでわからないです。
0212デフォルトの名無しさん
NGNGどうせ名前で調べるし
0213デフォルトの名無しさん
NGNGこんなのどうやって知るのでしょうか。
参照するDLLを調べろということですかね。
どっかから入手したpecoff.docによると、
>6.4.3. Hint/Name Table
>Field Hint
>Description
> Index into the Export Name Pointer Table.
> A match is attempted first with this value. If it fails,
>a binary search is performed on the DLL's Export Name Pointer Table.
ということは、わかんなかったら0とかの適当な値でよいと言う事でしょうか。
試しに全部0にしてやったらうまくいきました。
このヒントは、パフォーマンス上の理由でしかないのでしょうか?
0214デフォルトの名無しさん
NGNGそうですね。
実験してとりあえず無視して問題なかったので、
しばらく放置プレイしときます。
0215デフォルトの名無しさん
NGNGリンカであらかじめ序数を控えておいた方が良いのかな。
DLLの関数を全部列挙するなんてAPIないですよね・・・。
objdump.exeで取ってくるしかない?
0216デフォルトの名無しさん
NGNG同じことだけど PE 解析ルーチンを書けばいい。
0217デフォルトの名無しさん
NGNGそれとexe自体よりスタートアップ作るのが面倒すぎる。
Win32APIしか使わないなら話は簡単だけど、
Cランタイム使えないとあんま意味ないんだよなあ。
とりあえずmsvcrt.dllを安全に使えるレベルとか考えてたけど
無理な気がしてきた。
mingwやlccwin解析すりゃいいんだろうけどね。
すげー遠い。
素直に既成のリンカへ.obj渡す事考えた方が早いかも。
0218デフォルトの名無しさん
NGNGという連載が始まったよ。
今回は13Pで、主に用語など基礎知識の説明でした。
次回はELF形式のお話みたいなんで期待。
0219デフォルトの名無しさん
NGNGInterfaceのこの手の記事は使えそうで使えないからなあ。
ELF形式なんてGNU系の資料いっぱいあるからPEやって欲しいのだが。
PEやる予定あるのかな。
無かったら笑えるがな。
0220デフォルトの名無しさん
NGNG0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
05/02/05 10:26:280223デフォルトの名無しさん
05/02/06 03:09:02実行ファイルを作成した場合、必ずどっちが優先されるとか
ってあるんでしょうか?
0224Rubyist!
05/02/06 03:12:030225デフォルトの名無しさん
05/02/14 14:21:01内容上重複というか同じような事書いてる部分は多いかもしれないが
読んで楽しめるとは思う
ちなみにLinker"s"
sが付く、これ重要
どうでもいいが漏れの近くの書店ではHTMLの分類の所に
隣近所はHTMLとかホームページとか
田舎の書店のアルバイトじゃ分類タイトルみただけじゃそうなるだろうなぁ
0226デフォルトの名無しさん
05/03/05 05:38:080227デフォルトの名無しさん
05/03/05 05:49:40オタ本の分類だろうし
少なすぎるというかそもそもたくさんある類いの本じゃないよね
0228226
05/03/05 06:05:41もっと美しく言うと専門書籍って言わない?(萌え本みたいな印象もあるし)
0229226
05/03/05 06:21:23みんな(出版社とか)は、わかって無いよなぁ。チャンスなのに。
0230デフォルトの名無しさん
05/03/05 06:42:57萌え本ってなんですか?
0231デフォルトの名無しさん
05/03/05 08:36:54http://www.google.co.jp/search?hl=ja&q=%E8%90%8C%E3%81%88%E6%9C%AC&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
0232デフォルトの名無しさん
2005/05/26(木) 21:34:03×ぶっちゃけ、「Linkers & Loaders」のような本が少なすぎる。
○ぶっちゃけ、「Linkers & Loaders」のような本を読む人が少なすぎる。
0233デフォルトの名無しさん
2005/05/26(木) 22:02:200234本田& ◆xOS3wf.pJg
2005/05/27(金) 01:11:58PEフォーマットってCOFFフォーマットの別名だよ。
0235デフォルトの名無しさん
2005/05/27(金) 19:17:49L&LかInterfaceの連載くらいしか見たことない。
>>234
PEとCOFFは同一ではないから、別名というのは違う。
COFFを拡張したのがPE。
0236デフォルトの名無しさん
2005/05/28(土) 22:18:450237デフォルトの名無しさん
2005/06/25(土) 21:26:29いったいこれは何なのか。
私の書いたmain以外のstartとかendとかいったシンボル名は何なのかと。
0238デフォルトの名無しさん
2005/06/25(土) 23:22:56ソース見たほうが早いよね
0239デフォルトの名無しさん
2005/06/25(土) 23:50:58ソースがあるといいね。
0240デフォルトの名無しさん
2005/06/26(日) 00:27:02ただの entry point でしょ。
>>239
何でソースが無いと思ったの?
0241239
2005/06/26(日) 01:04:27crt0.oなんて名前はありきたりで環境が分からないから。
0242237
2005/06/26(日) 09:42:430243デフォルトの名無しさん
2005/06/26(日) 15:20:31いっぱいあるよ
0244デフォルトの名無しさん
2005/06/26(日) 15:32:33crt0ってのは(名前からすると)Cランタイムライブラリを初期化するためのコードで、
Cランタイムライブラリに依存するもの(≒Cコンパイラに依存するもの)。
ライブラリ(コンパイラ)のマニュアルに書いてあるかもしれないし、
コンパイラセットにソースコードが付いてることもある(少なくともMSVCには付いてる)。
0245デフォルトの名無しさん
2005/06/26(日) 15:36:410246デフォルトの名無しさん
2005/06/26(日) 16:27:580247デフォルトの名無しさん
2005/06/26(日) 16:55:090248237
2005/06/26(日) 23:49:070249デフォルトの名無しさん
2005/06/27(月) 00:32:080250デフォルトの名無しさん
2005/06/27(月) 08:51:190251237
2005/06/27(月) 22:21:580252デフォルトの名無しさん
2005/06/27(月) 23:35:470253デフォルトの名無しさん
2005/06/28(火) 01:07:570254デフォルトの名無しさん
2005/06/28(火) 17:46:07一応、適当なリンクを貼っておくが。
http://pc8.2ch.net/test/read.cgi/tech/1058134693/726-
0255237
2005/07/02(土) 19:27:180256デフォルトの名無しさん
2005/07/03(日) 04:05:18無能は震えながらではなく、藁のように氏ぬのだ。
0257デフォルトの名無しさん
2005/07/03(日) 14:35:28そういうの恥ずかしいから辞めようよ
0258デフォルトの名無しさん
2005/07/03(日) 18:39:57【鉄則】アホはスルー
0259デフォルトの名無しさん
2005/07/04(月) 15:02:230260デフォルトの名無しさん
2005/09/18(日) 16:41:50リンカからコンパイラ、アセンブラまで作ったが
さすがにOSはアホらしいな。
0261デフォルトの名無しさん
2005/11/24(木) 04:18:36もしかしてWindows付属のDLLって全部アドレス空間のどこにマップされるか、
最初から全部決まってるの?
0262デフォルトの名無しさん
2005/11/24(木) 06:46:410263デフォルトの名無しさん
2005/11/24(木) 10:53:100264デフォルトの名無しさん
2005/11/24(木) 16:38:48 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´
∧∧ ) (´⌒(´
⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
 ̄ ̄ (´⌒(´⌒;;
ズザーーーーーッ
0265デフォルトの名無しさん
2005/11/24(木) 17:15:11それはもちろんそうなんだけど、仮想アドレス空間の無駄使いじゃない?
0266デフォルトの名無しさん
2005/11/24(木) 17:42:10ページは4kバイト単位なのでそうでもない
それに指定されたページにロードできなかった場合でも違う場所に割り当てられる
0267デフォルトの名無しさん
2005/11/24(木) 23:06:29世の中の大半の用途では、物理メモリはともかく
アドレス空間ケチるほどメモリ使わないので問題ない。
0268デフォルトの名無しさん
2005/11/24(木) 23:12:050269デフォルトの名無しさん
2005/11/24(木) 23:16:14くやしく
0270デフォルトの名無しさん
2005/11/24(木) 23:56:56>それに指定されたページにロードできなかった場合でも違う場所に割り当てられる
え、じゃあ例えば、俺の使ってるWindowsのNTDLL.DLL、
ImageBaseは0x77f80000という値になってるけど、これは
別の場所に再配置することも可能なの?
0271デフォルトの名無しさん
2005/11/24(木) 23:57:00ELFへの移行は
・共有ライブラリが作りやすい
・動的リンクがやりやすい
・クロス開発がやりやすい
・C++対応(コンストラクタとデストラクタ)
が主な理由。
64bit対応ってのは(当時と今は)あまり重要ではない。
未来は知らんが。
0272デフォルトの名無しさん
2005/11/25(金) 00:07:06DLLは基本的に再配置するものなので、必ず再配置セクションを持つ。
NTDLL.DLLも再配置セクションがあるので(dumpbinで覗いてみ)、
必要なら再配置できる。
0273デフォルトの名無しさん
2005/11/25(金) 01:32:46それだとImageBaseを固定するメリットってあんまりなくない?
0274デフォルトの名無しさん
2005/11/25(金) 02:31:37適当なアドレスに固定してるんじゃなくて、
一通りメモリに読み込んで再配置完了したのと同等のアドレスにしてある。
アプリ起動のたびにほぼ必ず読み込まれるシステム系のDLLを
毎回再配置しないで済む分、起動が速くなる。
0275デフォルトの名無しさん
2005/12/21(水) 10:46:27とりあえず、ヒントくれ
0276デフォルトの名無しさん
2005/12/21(水) 13:35:48objcpy
0277デフォルトの名無しさん
2005/12/25(日) 19:40:34Cygwin/Mingwが吐く relocatable object file は
MS環境でもリンクできる。
なので objcopy 最強。
0278デフォルトの名無しさん
2005/12/25(日) 23:37:14例えば
elf32-i386 -> elf32-powerpcle
とか。
0279デフォルトの名無しさん
2005/12/26(月) 00:50:29できたと思った。昔configureして
ぜんぶ入りのobjcopyを作ったことがある
0280278
2005/12/26(月) 16:09:38できないお >_<
$ objcopy -I elf32-i386 -O elf32-powerpcle foo foo-ppc
objcopy: Warning: Output file cannot represent architecture `i386'
targetにはちゃんと入ってるお
$ objcopy 2>&1 | tail -1
objcopy: supported targets: elf64-x86-64 elf32-i386 a.out-i386-linux efi-app-ia32 elf64-little elf64-big
elf32-little elf32-big elf64-alpha ecoff-littlealpha elf32-hppa-linux elf32-hppa elf64-ia64-little elf64-ia64-big
efi-app-ia64 elf32-m68k a.out-m68k-linux elf32-powerpc aixcoff-rs6000 elf32-powerpcle ppcboot
elf64-powerpc elf64-powerpcle aixcoff64-rs6000 elf32-s390 elf64-s390 elf32-sparc a.out-sparc-linux
elf64-sparc a.out-sunos-big srec symbolsrec tekhex binary ihex
0281デフォルトの名無しさん
2005/12/27(火) 20:48:330282デフォルトの名無しさん
2006/02/17(金) 13:52:541時間以内に返答が無かったら賛同してくれるものと見なす。
0283デフォルトの名無しさん
2006/02/17(金) 14:14:27まさか、単なる保守 age じゃないよね??
0284デフォルトの名無しさん
2006/02/17(金) 14:17:11ネタはないですね。そろそろ落ちるんじゃないかと思った。
しいて言えば本購入予定です。ハイ。
0285デフォルトの名無しさん
2006/02/20(月) 11:25:050286デフォルトの名無しさん
2006/02/21(火) 10:47:360287デフォルトの名無しさん
2006/04/25(火) 10:08:260288287
2006/04/25(火) 13:37:56.so → .lo
というlibtool版か。
.soはあるのに、.laがなくなると起動しなくなるものがあるって事は、
.laをdlopenしているアプリがあるのかな。
0289287
2006/04/25(火) 16:17:410290デフォルトの名無しさん
2006/04/28(金) 22:50:10そーそー、textファイルだから、開けてびっくりするよな。
libディレに、んなもんイッパイ入れんな!と、最初思ったよ。
■ このスレッドは過去ログ倉庫に格納されています