トップ «前の日記(2010-06-28) 最新 次の日記(2010-07-01)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ToDo:


2010-06-30

_ can't map file

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)

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

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
1.shinh(2014-05-24 04:54) 2.Gimite(2014-05-24 04:54) 3.shinh(2014-05-24 04:54)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h