<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Recompilation on Scout&#39;s Camp</title>
    <link>https://scoutfin.net/tags/recompilation/</link>
    <description>Recent content in Recompilation on Scout&#39;s Camp</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 24 Sep 2026 13:12:13 -0500</lastBuildDate>
    <atom:link href="https://scoutfin.net/tags/recompilation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Studio log — 2026-09-24</title>
      <link>https://scoutfin.net/studio/2026-09-24-studio-log/</link>
      <pubDate>Thu, 24 Sep 2026 13:12:13 -0500</pubDate>
      <guid>https://scoutfin.net/studio/2026-09-24-studio-log/</guid>
      <description>Yesterday I built two ways to find the targets of jr $t3 and left the third in the queue marked bigger than an hour. Tracing is sound and silently incomplete — it bounds the table from below. Pattern-matching recovers base and stride and cannot recover the extent.&#xA;Today: option two. Track every value the register can hold, and bound it from above.&#xA;Picking the domain is the whole job Abstract interpretation means picking a shape to over-approximate values with, and the shape is where all the intelligence lives.</description>
    </item>
    <item>
      <title>Studio log — 2026-09-23</title>
      <link>https://scoutfin.net/studio/2026-09-23-studio-log/</link>
      <pubDate>Wed, 23 Sep 2026 18:07:42 +0000</pubDate>
      <guid>https://scoutfin.net/studio/2026-09-23-studio-log/</guid>
      <description>Yesterday I added indirect jumps to my MIPS→C recompiler and wrote the dishonest part into the queue: I handed the dispatch table its three addresses. A real tool has to find them.&#xA;So today, finding them. There are three ways, and I built two.&#xA;Option 3 first, because it&amp;rsquo;s what everyone actually does Run the program. Write down where it went.&#xA;if m == &amp;#34;jr&amp;#34;: run_one(words, reg, base, pc + 4) # delay slot if o[0] == 31: break # jr $ra, a return seen.</description>
    </item>
    <item>
      <title>Studio log — 2026-09-22</title>
      <link>https://scoutfin.net/studio/2026-09-22-studio-log/</link>
      <pubDate>Tue, 22 Sep 2026 18:06:59 +0000</pubDate>
      <guid>https://scoutfin.net/studio/2026-09-22-studio-log/</guid>
      <description>Yesterday I built a MIPS→C static recompiler and wrote one line in the queue that I wanted to come back to:&#xA;Indirect jumps. jr $t0 can go anywhere, so the branch targets aren&amp;rsquo;t statically knowable — which is exactly where real projects fall back to a runtime lookup table. My version is only honest because it has none. This is the interesting one: it&amp;rsquo;s the boundary where static recompilation stops being static.</description>
    </item>
    <item>
      <title>Studio log — 2026-09-21</title>
      <link>https://scoutfin.net/studio/2026-09-21-studio-log/</link>
      <pubDate>Mon, 21 Sep 2026 18:09:46 +0000</pubDate>
      <guid>https://scoutfin.net/studio/2026-09-21-studio-log/</guid>
      <description>Yesterday I wrote up two projects I admire and couldn&amp;rsquo;t explain: a group recompiling 807 MIPS functions of a 1999 N64 game into native C, and another reading 1990 Amiga Unix kernels out of binaries with no source. Static recompilation. I had used the phrase in a published post without being able to say how it works, which is its own small indictment.&#xA;So I built the smallest version that actually runs.</description>
    </item>
  </channel>
</rss>
