ToDo:
Mac は不思議がいっぱいだ!
まず ld が表題のエラーを出す件は、 これはまぁ普通に仮想メモリ空間が足りない。
http://www.opensource.apple.com/source/ld64/ld64-97.2/src/ld/ld.cpp
uint8_t* p = (uint8_t*)::mmap(NULL, info.fileLen, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
if ( p == (uint8_t*)(-1) )
throwf("can't map file, errno=%d", errno);
どうしたもんかなーというと、 正直 release build するくらいしか短期的な方法は思いつかん。
さて中期的な方法を考える。 どうせ mmap できないファイルなんて archive に決まってる、 そして archive を全部一気に mmap する理由とかどこにもない。
OK だいたいわかった。
Mach-O の .a はたぶん最初のエントリとしてなんかテーブルが入ってる。 これはたぶん ranlib が作るエントリだ。 名前が __.SYMDEF ならこのエントリになるっぽい。たぶん。 このファイル名のファイル作って突っ込んだらどうなるだろうね。
でまぁ Reader::getAtoms やら Reader::validFile やらは、 このエントリの列を iterate してるわけだなー。 iterate してる最中は、
template <typename A>
const class Reader<A>::Entry* Reader<A>::Entry::getNext() const
{
const uint8_t* p = this->getContent() + getContentSize();
p = (const uint8_t*)(((uintptr_t)p+3) & (-4)); // 4-byte align
return (class Reader<A>::Entry*)p;
}
てな感じなので、 ちょぼちょぼ munmap mmap がはさまるような構造にしてやればいいんじゃないかねー。 やってられるかー
(00:40)
すげえ雑な方法で自分のところではリンクは通るようになった。
diff -ur ld64-85.2.1.orig/src/ld.cpp ld64-85.2.1/src/ld.cpp
--- ld64-85.2.1.orig/src/ld.cpp 2010-06-29 07:54:08.000000000 -0700
+++ ld64-85.2.1/src/ld.cpp 2010-06-29 09:15:37.000000000 -0700
@@ -3088,12 +3088,19 @@
}
+
+struct GreaterFileSize {
+ bool operator()(const Options::FileInfo& l, const Options::FileInfo& r) {
+ return l.fileLen > r.fileLen;
+ }
+};
void Linker::createReaders()
{
fStartCreateReadersTime = mach_absolute_time();
std::vector<Options::FileInfo>& files = fOptions.getInputFiles();
+ sort(files.begin(), files.end(), GreaterFileSize());
const int count = files.size();
if ( count == 0 )
throw "no object files specified";
つまり全ファイルをデカい順に sort 。 ただこれでは chromium の bot はなおらんだろうね。 なんか build log 見ると謎の hack がボットには入ってるっぽい。
3時間ほどあれば根治もできると思うがー
(01:31)
| 前 | 2010年 6月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | |||
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。