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扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。