How to execute an object file: Part 2

Handling relocations In the previous post, we learned how to parse an object file and import and execute some functions from it. However, the functions in our toy object file were simple and self-contained: they computed their output solely based on their inputs and didn't have any external code or…

How to execute an object file: Part 1

Calling a simple function without linking When we write software using a high-level compiled programming language, there are usually a number of steps involved in transforming our source code into the final executable binary: First, our source files are compiled by a compiler translating the high-level programming language into machine…

Diving into /proc/[pid]/mem

A few months ago, after reading about Cloudflare doubling its intern class size, I quickly dusted off my CV and applied for an internship. Long story short: now, a couple of months later, I found myself staring into Linux kernel code and adding a pretty cool feature to gVisor, a…

When Bloom filters don’t bloom

I've known about Bloom filters (named after Burton Bloom) since university, but I haven't had an opportunity to use them in anger. Last month this changed - I became fascinated with the promise of this data structure, but I quickly realized it had some drawbacks. This blog post is the…
1 2 3