<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>glandium.org</title>
	<atom:link href="http://glandium.org/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://glandium.org/blog</link>
	<description>glandium.org</description>
	<lastBuildDate>Wed, 14 Jul 2010 16:37:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>I/O patterns on ELF binary initialization</title>
		<link>http://glandium.org/blog/?p=1016</link>
		<comments>http://glandium.org/blog/?p=1016#comments</comments>
		<pubDate>Wed, 14 Jul 2010 16:37:13 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[mozilla]]></category>
		<category><![CDATA[en]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=1016</guid>
		<description><![CDATA[[ I meant to finish this article much earlier, but i had to leave it in a half-written draft state for quite some time due to other activities ] One particular issue that arises with big binary files is that of I/O patterns. It looks like it is not something under the usual scope for [...]]]></description>
			<content:encoded><![CDATA[<p>[ I meant to finish this article much earlier, but i had to leave it in a half-written draft state for quite some time due to other activities ]</p>
<p>One particular issue that arises with big binary files is that of I/O patterns. It looks like it is not something under the usual scope for both <code>ld.so</code> and programs/libraries, but it can have a dramatic influence on startup times. My analysis is far from complete, would need to be improved by actually investigating <code>ld.so</code> code further, and so far has been limited to libxul.so built from mozilla-central, with the help of icegrind, on x86-64 linux.</p>
<p>As I <a href="/blog/?p=1008">wrote recently</a>, icegrind allows to track memory accesses within <code>mmap()</code>ed memory ranges. As <code>ld.so</code> does <code>mmap()</code> the program and library binaries, tracking the memory accesses within these <code>mmap()</code>s allows to get a better idea at I/O patterns when an ELF binary is initialized. I only focused on local accesses within a single given binary file (libxul.so) because the case of Firefox loading many files at startup is already being scrutinized, and because most of the non-Firefox files being read at Firefox startup (system and GNOME libraries) are most likely already in the page cache. I also focused on that because it was an interesting case that could be helpful to understand how big (and maybe less big) binaries may be affected by the toolchain (compiler, linker and dynamic linker) and possibly by some coding practices.</p>
<p>For the record, what I did to get these results is to use <a href="/blog/?p=1008">icegrind and elflog</a>, with further additions to the &#8220;sections&#8221; file with some output from &#8220;<code>objdump -h</code>&#8220;: I added sections that elflog wouldn&#8217;t give (such as <code>.plt</code>, <code>.hash</code>, <code>.dynsym</code>, etc.), and even down to the entry level for the <code>.rela.dyn</code> section. The latter is particularly interesting because icegrind only outputs the first access for any given section. To see sequential accesses within that section, you need to split it in smaller pieces, which I did for <code>.rela.dyn</code> entries (each one being 24 bytes on x86-64). Uncommenting some parts of the icegrind code was also useful to track where some accesses were made from, code-wise.</p>
<p>Now, the interesting data:</p>
<p>One of the first accesses is a nullification of a few variables within the <code>.bss</code> section. The <code>.bss</code> section is usually an anonymous piece of memory, that is, a range of <code>mmap()</code>ed memory that is not backed by a file, and filled with zeroes by the kernel (I think it even does that lazily). It is used for e.g. variables that are initialized with zeroes in the code, and obviously, any code accessing these variables would be addressing at some offset of the <code>.bss</code> section. It means the section needs to start in memory at the offset it has been assigned by the linker at build time. This is actually where problems begin.</p>
<p>When the <code>.bss</code> section offset as assigned by the linker doesn&#8217;t align on a page (usually 4KB), the <code>mmap()</code>ed <code>.bss</code> can&#8217;t be at that location, and really starts on the next page. The remainder is still <code>mmap()</code>ed from the binary file, and <code>ld.so</code> will itself fill that part. As the <code>.bss</code> section doesn&#8217;t start on a page boundary, any write at this location will trigger the kernel reading the entire page. This means one of the first set of data being read from the file is the end of the section preceding <code>.bss</code>, and the beginning of the following one. Most likely, respectively the <code>.data</code> and <code>.comment</code> sections.</p>
<p>While this probably doesn&#8217;t matter much when the binary file is small, when it is big enough, reading in a non sequential manner will trigger hard disk seeks, and we all know how they can hurt performance. Although thankfully, cheap SSDs should be coming some day, in the meanwhile, we still need to cope with the bad performance. The interesting part is, the <code>.bss</code> section is really empty in the binary file, so its &#8220;virtual&#8221; memory address could be anywhere. Why the linker wouldn&#8217;t align it at a page boundary without having to resort to a linker script is beyond me.</p>
<p>The next accesses go back and forth between <code>.dynamic</code>, <code>.gnu.hash</code>, <code>.dynstr</code>, <code>.gnu.version_r</code>, <code>.gnu.version</code> and <code>.dynsym</code>. These are probably all related to symbol version resolution and DT_NEEDED library loading. While most of these sections are at the beginning of the file (not necessarily in the order they are read from), the <code>.dynamic</code> section is much nearer to the end, but way before <code>.data</code>, so that it won&#8217;t even have been loaded as a by-product of the <code>.bss</code> section loading.</p>
<p>After that, the <code>.rela.dyn</code> section is read, and for each relocation entry it contains, the relocations are being applied. Relocations is one of the mechanisms by which position independent code (PIC) is made possible. When a library is loaded in memory, it is not necessarily loaded at the same address every time. The code and data contained in the library thus need to cope with that constraint. Fortunately, while the base address where the library is <code>mmap()</code>ed in memory is not necessary constant, the offsets of the various sections are still as codified in the binary. The library code can thus directly access data at the right offset if it knows the base offset of the library (which is what is done on the x86 ABI), or if it knows where the current instruction is located (which is what is done on the x86-64 ABI).</p>
<p>&#8220;Static&#8221; data (initialized in e.g. a <code>const</code> or a global variable, or, in C++ case, vtables), on the other hand, may contain pointers to other locations. This is where relocation enters the scene. The <code>.rela.dyn</code> section contains a set of rules describing where in the binary some pointers need to be adjusted depending on the base library offset (or some other information), and how they should be updated. <code>ld.so</code> thus reads all <code>.rela.dyn</code> entries, and applies each relocation, which means that while <code>.rela.dyn</code> is being read sequentially, reads and writes are also performed at various places of the binary, depending on the content of the <code>.rela.dyn</code> entries.</p>
<p>This is where this gets ugly for Firefox: there are near 200000 such relocations. On x86-64 an entry is 24 bytes (12 on x86), and each of these is going to read/write a pointer (8 bytes on x86-64, 4 on x86) at some random (though mostly ordered) location. The whole <code>.rela.dyn</code> section not being read ahead, what actually happens is that it is read in small batches, with seeks and reads of other data at various locations in between. In libxul.so case, this spreads over <code>.ctors</code>, <code>.data.rel.ro</code>, <code>.got</code>, and <code>.data</code>. The relocation entries are somehow ordered by address to be rewritten, though they occasionally jump backwards. Some of these relocations also appear to be touching to <code>.gnu.version</code>, <code>.dynsym</code> and <code>.dynstr</code>, because their type involves a symbol resolution.</p>
<p>Once <code>.rela.dyn</code> relocation have been dealt with comes <code>.rela.plt</code>&#8216;s turn. The principle is the same for this section: entries describe what kind of relocation must be done where, and how the result must be calculated. The scope of this section, though, is apparently limited to <code>.got.plt</code>. But before explaining these relocations, I&#8217;ll explain what happens with the PLT.</p>
<p>The PLT (Procedure Linkage Table) is used when calling functions from external libraries. For example, in a Hello World example, the PLT would be used for calls to the <code>puts</code> function. The function making the call would in fact call the corresponding PLT location. The PLT itself, on x86 and x86-64, at least, consists of 3 instructions (I&#8217;ll skip the gory details, especially for x86, where the caller needs to also set some register before calling the PLT). The first instruction is the only one to be called most of the time: it reads the final destination in the <code>.got.plt</code> section, and jumps there. That final destination, obviously, is not fixed in the library file, since it needs to be resolved by its symbol. This is why the two subsequent instructions exist : originally, the destination &#8220;stored&#8221; in the <code>.got.plt</code> section points back to the second instruction ; the first instruction will effectively be a nop (no operation), and the following instructions will be executed. They will jump into code responsible for symbol resolution, update of the <code>.got.plt</code> entry for the next call, and call of the real function.</p>
<p>But pointing back to the second instruction is like the pointers in static data we saw above : it&#8217;s not possible in position independent code. So, the <code>.rela.plt</code> relocations are actually filling the <code>.got.plt</code> section with these pointers back to the PLT. There are a tad more than 3000 such relocations.</p>
<p>All these relocations should be going away when prelinking the binaries, but from my several experimentations, it looks like prelinking only avoids relative relocations, and not the others, while it technically could skip all of them. <code>prelink</code> even properly applies all the relocations in the binary, but executing the binary rewrites the same information at startup for all but relative relocations. That could well be a bug in either <code>ld.so</code> not skipping enough relocations or <code>prelink</code> not marking enough relocations to be skipped. I haven&#8217;t dug deep enough in the code to know how prelinking works exactly. Anyways, prelinking is not a perfect solution, as it also breaks <a href="http://en.wikipedia.org/wiki/Address_space_layout_randomization">ASLR</a>. Sure, prelink can randomize library locations, but it relies on the user or a cron job doing so at arbitrary times, but that&#8217;s far from satisfying.</p>
<p>An interesting thing to note, though, is that a good part of the relocations prelinking doesn&#8217;t rid us of in libxul.so (more than 25000) are due to the <code>__cxa_pure_virtual</code> symbol, which is used for, well, pure virtual methods. In other words, virtual methods that don&#8217;t have an implementation in a given class. The <code>__cxa_pure_virtual</code> function is set as method in the corresponding field(s) of the class VTABLE in the <code>.data.rel.ro</code> section. This function is provided by libstdc++, and as such, is dynamically linked. But this function is just a dummy function, doing nothing. Defining an empty <code>__cxa_pure_virtual</code> function to be included in libxul.so makes these relocations become relative, thus taken care of by prelinking.</p>
<p>After all relocations occur, the library initialization itself can begin, and the content of the <code>.init</code> section is executed. That section, indirectly, executes all functions stored in the <code>.ctors</code> section. This includes static initializers, which are unfortunately called backwards, as <a href="http://blog.mozilla.com/tglek/2010/05/27/startup-backward-constructors">Taras pointed out already</a>. Each of these static initializers are also accessing various locations in the <code>.data</code> or <code>.bss</code> sections, which may or may not have already been loaded during the relocation phase. The execution of these initializers will also (obviously) read various pieces of the <code>.text</code> section  (despite its name, it contains executable sections, i.e. functions code).</p>
<p>The initialization of the library ends there, and no access should happen until a function from the library is called. In libxul.so case, XRE_main is first called, then many other functions, but that&#8217;s another story. All that needs to be remembered about the startup process past this point is that the <code>.text</code> section will be read heavily, as well as the various data, got, plt and dynamic symbol sections, in a very scattered way. While most of these sections may have been retrieved in memory already, as a byproduct of the various initialization processes described above, some may have not, increasing even more the need to seek at all places in the binary file.</p>
<p>Now the main problem with all these I/O patterns at startup, is that it seems the only way reorganizing the binary layout may have a visible impact is by considering <em>all</em> the above, and not only a part of it, because only addressing a part of it is very likely to only move part of the problem to a different layer.</p>
<p>All in all, making sure the relevant sections of libxul.so are read by the kernel before <code>ld.so</code> enters the game is a good short-term solution to avoid many seeks at startup.</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=1016</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Iceweasel 4.0 beta 1を公開</title>
		<link>http://glandium.org/blog/?p=1037</link>
		<comments>http://glandium.org/blog/?p=1037#comments</comments>
		<pubDate>Fri, 09 Jul 2010 19:34:41 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[firefox]]></category>
		<category><![CDATA[xulrunner]]></category>
		<category><![CDATA[ja]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=1037</guid>
		<description><![CDATA[Firefoxの最新ベータ版が公開された為、Iceweaselの4.0beta1バージョンをアップロードしました。unstableでもexperimentalでもなく、別のレポジトリへ。ですので、下記の行をsource.listに追加して下さい。 deb http://mozilla.debian.net/packages/ ./ 今の所、x86とx86-64（amd64）のパッケージしか入っていません。 unstableかexperimentalのバージョン（ベータじゃない方）を使用し続けたい場合は次のトリックを試してみて下さい。上記のレポジトリからiceweaselをインストールしずに、 xulrunner-1.9.2をインストール, iceweaselをダウンロード（インストールではなく）, 次のコマンドを実行：dpkg-deb -x iceweasel_4.0b1-0_*.deb /some/directory, シンボリックリンクを作成：ln -s /usr/lib/xulrunner-2.0 /some/directory/usr/lib. それでIceweaselのベータバージョンは/some/directory/usr/bin/iceweaselで起動が可能になります。以前のバージョンでもこのトリックを利用出来るはずです。]]></description>
			<content:encoded><![CDATA[<p>Firefoxの最新ベータ版が公開された為、Iceweaselの4.0beta1バージョンをアップロードしました。unstableでもexperimentalでもなく、別のレポジトリへ。ですので、下記の行を<code>source.list</code>に追加して下さい。</p>
<blockquote><p><code>deb http://mozilla.debian.net/packages/ ./</code></p></blockquote>
<p>今の所、x86とx86-64（amd64）のパッケージしか入っていません。</p>
<p>unstableかexperimentalのバージョン（ベータじゃない方）を使用し続けたい場合は次のトリックを試してみて下さい。上記のレポジトリからiceweaselをインストールしずに、</p>
<ul>
<li>xulrunner-1.9.2をインストール,</li>
<li>iceweaselをダウンロード（インストールではなく）,</li>
<li>次のコマンドを実行：<code>dpkg-deb -x iceweasel_4.0b1-0_*.deb /some/directory</code>,</li>
<li>シンボリックリンクを作成：<code>ln -s /usr/lib/xulrunner-2.0 /some/directory/usr/lib</code>.</li>
</ul>
<p>それでIceweaselのベータバージョンは<code>/some/directory/usr/bin/iceweasel</code>で起動が可能になります。以前のバージョンでもこのトリックを利用出来るはずです。</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=1037</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Iceweasel 4.0 beta 1 preliminary packages for Debian, and a nice trick</title>
		<link>http://glandium.org/blog/?p=1032</link>
		<comments>http://glandium.org/blog/?p=1032#comments</comments>
		<pubDate>Fri, 09 Jul 2010 18:59:08 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[firefox]]></category>
		<category><![CDATA[xulrunner]]></category>
		<category><![CDATA[en]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=1032</guid>
		<description><![CDATA[Since this blog is now syndicated on Planet Mozilla, a little background for its readers: Iceweasel is the name under which Firefox is distributed in Debian. This is an unfortunate detail due to copyright issues with the Firefox logos that have been solved recently. Work is under progress to get Firefox back in Debian (I [...]]]></description>
			<content:encoded><![CDATA[<p>Since this blog is now syndicated on <a href="http://planet.mozilla.org/">Planet Mozilla</a>, a little background for its readers: Iceweasel is the name under which Firefox is distributed in Debian. This is an unfortunate detail due to copyright issues with the Firefox logos that have been solved recently. Work is under progress to get Firefox back in Debian (I do have good hope this will be possible).</p>
<p>Anyways, I&#8217;ve started to work on getting Iceweasel in shape for the 4.0 release in a few months. The packaging being in a good enough shape, I am hereby making available some preliminary packages (meaning there is still some more work needed for proper packaging) for the first beta release.</p>
<p>The packages are available in a separate repository, which you need to add to your <code>sources.list</code>:</p>
<blockquote><p><code>deb http://mozilla.debian.net/packages/ ./</code></p></blockquote>
<p>Only x86 and x86-64 (amd64) packages are available for now. As far as I tested it, it works as well as the official Firefox 4.0beta1 binaries, though some xpcshell tests failed, and I haven&#8217;t got reftests working yet.</p>
<p>If you still wish to use a current version of iceweasel (i.e. non-beta), but want to try this beta, here is the nice trick: Instead of installing iceweasel from the above mentioned repository,</p>
<ul>
<li>Install xulrunner-1.9.2,</li>
<li>Download the iceweasel package (don&#8217;t install),</li>
<li>Run the following command: <code>dpkg-deb -x iceweasel_4.0b1-0_*.deb /some/directory</code>,</li>
<li>Create a necessary symbolic link: <code>ln -s /usr/lib/xulrunner-2.0 /some/directory/usr/lib</code>.</li>
</ul>
<p>Now you can start the Iceweasel beta with <code>/some/directory/usr/bin/iceweasel</code>. This trick should work with older versions of iceweasel, too.</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=1032</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>++age</title>
		<link>http://glandium.org/blog/?p=1025</link>
		<comments>http://glandium.org/blog/?p=1025#comments</comments>
		<pubDate>Wed, 16 Jun 2010 08:05:31 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[p.d.o]]></category>
		<category><![CDATA[en]]></category>
		<category><![CDATA[ja]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=1025</guid>
		<description><![CDATA[(gdb) p/x age $1 = 0x20]]></description>
			<content:encoded><![CDATA[<p><code>(gdb) p/x age<br />
$1 = 0x20</code></p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=1025</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Playing with icegrind</title>
		<link>http://glandium.org/blog/?p=1008</link>
		<comments>http://glandium.org/blog/?p=1008#comments</comments>
		<pubDate>Tue, 08 Jun 2010 16:46:42 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[mozilla]]></category>
		<category><![CDATA[en]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=1008</guid>
		<description><![CDATA[In the past few days, I&#8217;ve been playing with icegrind, a little valgrind plugin that Taras Glek wrote to investigate how Firefox startup spends its time in libxul.so reading/initialization, mostly. I invite you to check out his various posts on the subject, it&#8217;s an interesting read. After some fiddling with the original icegrind patch in [...]]]></description>
			<content:encoded><![CDATA[<p>In the past few days, I&#8217;ve been playing with <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=549749">icegrind</a>, a little valgrind plugin that <a href="http://blog.mozilla.com/tglek/">Taras Glek</a> wrote to investigate how Firefox startup spends its time in libxul.so reading/initialization, mostly. I invite you to check out <a href="http://blog.mozilla.com/tglek/category/startup/">his various posts on the subject</a>, it&#8217;s an interesting read.</p>
<p>After some fiddling with the original icegrind patch in the bug linked above, I got some better understanding on the binary initialization phase (more on that in another post), as we could call it, and hit some problems due to problems in icegrind and elflog. The <a href="https://bug549749.bugzilla.mozilla.org/attachment.cgi?id=449748">latest version of the icegrind patch as of writing</a> solved my main problem half way (though it needs further modifications to work properly, see below).</p>
<p>What icegrind actually does is to track memory accesses in mmap()ed memory. When the program being profiled mmap()s a file, icegrind looks for a corresponding &#8220;sections&#8221; file next to it (e.g. &#8220;libxul.so.sections&#8221; for &#8220;libxul.so&#8221;). The &#8220;sections&#8221; file contains offsets, sizes, and sections names, that will be used by icegrind to report the accesses. Whenever the profiled program makes memory accesses (whether it is for instructions or data) within the mmap()ed range, icegrind will add the corresponding section name in a &#8220;log&#8221; file (e.g. &#8220;libxul.so.log&#8221; for &#8220;libxul.so&#8221;). Please note it will only do so for the first access in the given section.</p>
<p>To generate section information for ELF files, Taras also hacked an <a href="http://hg.mozilla.org/users/tglek_mozilla.com/startup/raw-file/6453ad2a7906/elflog.cpp">elflog program</a> that scans an ELF binary (program or library) and will output sections for symbols present in its symtab. This means the binary needs not to be stripped, though the full fledged debugging symbols are not needed. It outputs the sections names in a form that would be reusable in a linker script after a build with the &#8220;-ffunction-sections&#8221; and &#8220;-fdata-sections&#8221; compiler options, but that&#8217;s mostly irrelevant when what you are after is only to see what is going on, not to reorder the sections at link time. There are glitches in the way elflog works that makes the section names for .bss symbols wrong (they will start with .symtab, .shstrtab, .comment, etc. instead of .bss). Also, technically, the .bss section is not mapped from the file. </p>
<p>Note icegrind has rough edges, is still experimental, and isn&#8217;t very user friendly, as in unix permissions, because its input and output files need to be next to the file being mmap()ed, and when that is a library in /usr/lib, well, you need write access there ; or you need to copy the library in a different directory and adjust LD_LIBRARY_PATH. Anyways, it&#8217;s already useful as it currently is.</p>
<p>If you want to play with it yourself, here are steps that worked well for me:</p>
<ul>
<li><code>svn co svn://svn.valgrind.org/valgrind/trunk valgrind -r 11100</code><br />
When I first tried icegrind, valgrind trunk was broken ; revision 11100 is known to work properly, at least for icegrind.</li>
<li><code>cd valgrind</code></li>
<li><code>wget -O - -q https://bug549749.bugzilla.mozilla.org/attachment.cgi?id=449748 | patch -p0</code><br />
You need to open <code>icegrind/ice_main.c</code>, go on the last line of the <code>track_mmap</code> function and replace <code>mmaps</code> with <code>dest_mmaps</code>.</li>
<li><code>mkdir icegrind/tests ; touch icegrind/tests/Makefile.am</code><br />
The valgrind build system is a bit lunatic.</li>
<li><code>libtoolize ; aclocal ; automake --add-missing ; autoreconf</code></li>
<li><code>./configure; make</code>
</li>
<li><code>wget http://hg.mozilla.org/users/tglek_mozilla.com/startup/raw-file/6453ad2a7906/elflog.cpp</code></li>
<li><code>g++ -o elflog elflog.cpp -lelf</code><br />
You will need the <code>libelf-dev</code> package.</li>
<li><code>make install ; install -m 755 elflog /usr/local/bin</code><br />
as root, to install in <code>/usr/local</code>.</li>
</ul>
<p>Once you&#8217;re done with this setup, you are ready to start playing:</p>
<ul>
<li><code>elflog --contents libxul.so > libxul.so.sections</code><br />
Be aware that if libxul.so is a symbolic link pointing to a file in another directory, as it happens in the dist/bin directory in mozilla builds, the &#8220;sections&#8221; file needs to be in that other directory.</li>
<li><code>LD_LIBRARY_PATH=. valgrind --tool=icegrind ./firefox-bin -P my-profile -no-remote about:blank</code></li>
</ul>
<p>Obviously, you don&#8217;t have to play around with Firefox. You can try with other libraries, or even programs. You&#8217;ll see in a subsequent post, however, that to get more interesting information, the elflog output is unfortunately not enough.</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=1008</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recommended for You</title>
		<link>http://glandium.org/blog/?p=1002</link>
		<comments>http://glandium.org/blog/?p=1002#comments</comments>
		<pubDate>Sat, 22 May 2010 09:33:24 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[en]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=1002</guid>
		<description><![CDATA[There is a part on the Youtube home page which recommends some videos based on what you already watched. I&#8217;m still trying to understand what kind of link there can be.]]></description>
			<content:encoded><![CDATA[<p>There is a part on the Youtube home page which recommends some videos based on what you already watched.</p>
<p><img src="http://glandium.org/blog/wp-content/uploads/2010/05/youtube.png" /></p>
<p>I&#8217;m still trying to understand what kind of link there can be.</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=1002</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google日本語入力がオープンソースになりました</title>
		<link>http://glandium.org/blog/?p=998</link>
		<comments>http://glandium.org/blog/?p=998#comments</comments>
		<pubDate>Tue, 11 May 2010 08:33:36 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[p.d.o]]></category>
		<category><![CDATA[ja]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=998</guid>
		<description><![CDATA[前からGoogle日本語入力ソフトが気になっていましたが、残念ながらLinux版がなくて試せませんでした。今日はChromium OSのためにオープンソースになったそうです。それでLinux版も出てきました。 さっきインストールして、今使ってみています。Primeみたいに予測入力システムになっています。元のGoogle日本語入力の辞書はインターネット上から生成されたそうですがオープンソース版は別の辞書を使用しているそうです。もっと入力しないとPrimeとAnthyとどう違うか、どれが一番使い安いか分かりませんな〜。 とにかくその入力ソフトがibus上で働くので、ibusも必要です。]]></description>
			<content:encoded><![CDATA[<p>前からGoogle日本語入力ソフトが気になっていましたが、残念ながらLinux版がなくて試せませんでした。今日はChromium OSのために<a href="http://googlejapan.blogspot.com/2010/05/google_10.html">オープンソースになった</a>そうです。それで<a href="http://code.google.com/p/mozc/wiki/LinuxBuildInstructions">Linux版</a>も出てきました。<br />
さっきインストールして、今使ってみています。Primeみたいに予測入力システムになっています。元のGoogle日本語入力の辞書はインターネット上から生成されたそうですがオープンソース版は別の辞書を使用しているそうです。もっと入力しないとPrimeとAnthyとどう違うか、どれが一番使い安いか分かりませんな〜。<br />
とにかくその入力ソフトがibus上で働くので、<a href="/blog/?p=989">ibus</a>も必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=998</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Important milestone for Iceweasel in Debian</title>
		<link>http://glandium.org/blog/?p=992</link>
		<comments>http://glandium.org/blog/?p=992#comments</comments>
		<pubDate>Mon, 03 May 2010 12:49:12 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[firefox]]></category>
		<category><![CDATA[xulrunner]]></category>
		<category><![CDATA[en]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=992</guid>
		<description><![CDATA[I just uploaded a pre-release of Iceweasel 3.6.4 to experimental. This is an important milestone for several reasons: Last time I was able to push a pre-release was almost 2 years ago. This means the keeping up with upstream is mostly done. This also means I should be ready to create a 3.7alpha5 package when [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://glandium.org/blog/wp-content/uploads/2010/05/flash-crash.png" /></p>
<p>I just uploaded a pre-release of Iceweasel 3.6.4 to experimental. This is an important milestone for several reasons:</p>
<ul>
<li>Last time I was able to push a pre-release was almost 2 years ago. This means the keeping up with upstream is mostly done. This also means I should be ready to create a 3.7alpha5 package when upstream releases it.</li>
<li>It includes a new feature: Out of Process Plugins. This means plugins instances are sandboxed and if they crash, they won&#8217;t take the browser down with them (finally). In this release, only the Adobe flash plugin is sandboxed, but it should be enough for the vast majority of plugin induced crashes.</li>
<li>Upstream is particularly interested in feedback from Debian (experimental) users for this pre-release, as they usually don&#8217;t get much feedback from their own linux pre-release builds except from the test suite.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=992</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>日本語入力をibusで</title>
		<link>http://glandium.org/blog/?p=989</link>
		<comments>http://glandium.org/blog/?p=989#comments</comments>
		<pubDate>Mon, 26 Apr 2010 07:11:26 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[p.d.o]]></category>
		<category><![CDATA[ja]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=989</guid>
		<description><![CDATA[最近まで、scimを使っていましたが、一週間前ibusを使ってみました。Input Method自体がまだanthyですけれどナントナクibusの方が使い易いというか楽というか。 とにかく、Debianでインストールするのは簡単です。最初はrootで： $ apt-get install ibus-anthy ibus-gtk ibus-qt4 （Gnome/Gtk+のソフトだけを使ってる場合はibus-gtkだけでいいですし、KDE/Qtの場合はもちろんibus-qt4だけでもいいです） 次にユーザで： $ im-switch -s ibus]]></description>
			<content:encoded><![CDATA[<p>最近まで、<a href="http://www.scim-im.org/">scim</a>を使っていましたが、一週間前<a href="http://code.google.com/p/ibus/">ibus</a>を使ってみました。Input Method自体がまだ<a href="http://anthy.sourceforge.jp/">anthy</a>ですけれどナントナクibusの方が使い易いというか楽というか。</p>
<p>とにかく、Debianでインストールするのは簡単です。最初はrootで：</p>
<blockquote><p><code>$ apt-get install ibus-anthy ibus-gtk ibus-qt4</code> （Gnome/Gtk+のソフトだけを使ってる場合はibus-gtkだけでいいですし、KDE/Qtの場合はもちろんibus-qt4だけでもいいです）
</p></blockquote>
<p>次にユーザで：</p>
<blockquote><p><code>$ im-switch -s ibus</code></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=989</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A new world of possibilities is opening up</title>
		<link>http://glandium.org/blog/?p=986</link>
		<comments>http://glandium.org/blog/?p=986#comments</comments>
		<pubDate>Mon, 19 Apr 2010 21:21:57 +0000</pubDate>
		<dc:creator>glandium</dc:creator>
				<category><![CDATA[firefox]]></category>
		<category><![CDATA[xulrunner]]></category>
		<category><![CDATA[en]]></category>

		<guid isPermaLink="false">http://glandium.org/blog/?p=986</guid>
		<description><![CDATA[Account created for myaddress&#60;at&#62;glandium.org with hg_mozilla and mg_mozsrc bits enabled. Yes, this means I now have commit access on hg.mozilla.org. Thanks to those who vouched for me, namely Justin Wood, Christian Biesinger and Benjamin Smedberg. And thanks to the Mozilla governance for having changed the commit access requirements just in time for me to take [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Account created for <em>myaddress&lt;at&gt;glandium.org</em> with hg_mozilla and mg_mozsrc bits enabled.</p></blockquote>
<p>Yes, this means I now have commit access on <a href="http://hg.mozilla.org/">hg.mozilla.org</a>. Thanks to those who vouched for me, namely Justin Wood, Christian Biesinger and Benjamin Smedberg.</p>
<p>And thanks to the Mozilla governance for having changed the commit access requirements just in time for me to take advantage of the new ones: under the old rules, it was required that the vouching superreviewer had never reviewed a patch from the person applying for commit access. Of the 31 superreviewers, 14 (almost half of them) already had reviewed one or more patches from me (which is not really unexpected, considering the number of patches I sent in the past).</p>
<p>One could wonder why I never applied for access earlier, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://glandium.org/blog/?feed=rss2&amp;p=986</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
