ld does not check properly for output I or D bigger than 64K. If you load together three files, each roughly this: char foo[30000] = {0}; ld will do it without complaining and the a.out will be the appropriate size, but of course the size numbers in the header will have overflowed and the result won't be too useful.