Can someone clarify something for me in that second assembly dump: It does:
xor %eax %eax (2 bytes)
mov $0x0,%edi (5 bytes)
Why does it decide to use 2 different ways to zero a register, the second one less efficient than the first? Or will the second one be patched while linking, i.e. the 0 is a placeholder for some other address?