I'm going to write my first compiler (ok... most of the work was done by using ANTLR, but it still required effort)... I have already done the following things:
Now my question is - if I want to create the COFF object files myself, how do I reference external symbols in libraries / other object files?
I mean, for example (if I want to call printf) it works like this, when I do it in ml64:
lea rcx, "address of string"
call printf
But what exactly do I write into the COFF file instead of "printf"?
Everything else is not THAT hard to implement, but I have absolutely no idea how to go about referencing libraries / other object files... hm...
Edit: fixed formatting (sorry) + clarifications
Instead of the printf, you write four times 0x00
, i. e. the call itself is assembled as 0xe8 0x00 0x00 0x00 0x00
. Further, you need to write a relocation record with type DISP32, with the offset pointing to the first 0x00
and a value pointing to a symbol entry with the name printf. Wikipedia has some links to documents describing the COFF format in detail.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With