These links are amazing. I would have never found these. I've been looking for good introductory resources for the past few days now. So glad to see this pop up in my news reader.
/// The C convention as implemented on Windows/x86-64 and
/// AArch64. This convention differs from the more common
/// \c X86_64_SysV convention in a number of ways, most notably in
/// that XMM registers used to pass arguments are shadowed by GPRs,
/// and vice versa.
/// On AArch64, this is identical to the normal C (AAPCS) calling
/// convention for normal functions, but floats are passed in integer
/// registers to variadic functions.
IIRC: while it's not explicitly documented, x86_64 was late enough in the game that both windows and Unix systems have the same calling convention. Saves a lot of hassle :)
They do not use the same convention. AMD did define a calling convention as part of their SysV ABI spec, and pretty much everybody adopted that ABI... except for Windows.
As to why, the best we have is informed speculation:
Nope, the Windows ABI uses a different set of registers than the SysV (Unix) ABI. SysV uses rdi, rsi, rdx, rcx, r8, r9 (in that order), and Windows uses rcx, rdx, r8, r9 (in that order).
It's not just the registers, the use of the stack (e.g. lack of a "red zone" on Windows) as well as the data used for exception handling are different too.
Credits: This guide was originally created by Adam Ferrari many years ago, and since updated by Alan Batson, Mike Lack, and Anita Jones. It was revised for 216 Spring 2006 by David Evans.
In a similar vein, on the quest of understanding yet another abstraction layer deeper, I've been trying to get to grips with how linking/loading works by writing some ELFs by hand.
Dynamic linking is giving me some problems though---I can't seem to get ld.so to do relocs for me. This is almost certainly due to some fundamental misunderstanding of mine, but I don't have the debugging tools to easily correct this.
So far I've just been using readelf and LD_DEBUG to perform basic sanity checking, but now my only idea is to walk through ld.so using gdb.
Hello, sorry I don't have your solution but I'm in your situation with not quite understanding linking. I have a lot of issues with linking/calling C++ and C libraries from each other or other low level languages. My background is in web stuff.
Could you please point me to the resources you used to get to your present level? Thanks :)
The last reference above isn't directly about linking, but to make sense of things like symbol relocations, you need some familiarity with instruction encoding.
Finally, Brain Raiter has a neat series of blog on his attempt at writing the smallest ELF files possible. This is what inspired me to write my own ELFs in the first place. The focus is on ELF, but there is by necessity a discussion about how linking and loading works in that context:
Nice to see those mathematical instructions in a simple list. I spent a while recently writing a "math compiler", and it started out using integer multiplication, division, etc.
Now I do it properly with floating-point instructions:
https://software.intel.com/sites/default/files/m/d/4/1/d/8/I...
https://cs.brown.edu/courses/cs033/docs/guides/x64_cheatshee...
https://web.stanford.edu/class/archive/cs/cs107/cs107.1194/g...
reply