jrmacmillan@watdragon.waterloo.edu (John R. MacMillan) (08/15/88)
With the discussion of placement of /lib/crt0[s].o on the ld command line to get a -F file, I decided to look into why, and what I came up with is that it doesn't really work. According to the ld(1) man page, -F files have virtual addresses equal to the file offsets modulo 4096. Files compiled as above don't. So why does file(1) say it worked? Because /etc/magic decides that and object is -F if the _entry point_ is > 0x080000. Putting /lib/crt0.o _after_ other things makes this true, and thus tricks the file(1) command. The grisly details are included below. So this brings us back to: how do we get a _real_ -F file? Has anyone got a /lib/ifile.0413-F (this is what ld(1) looks for if you specify -F)? Is anyone enough of an ld(1) wizard to reconstruct it? Here's the whole of my little test, with some comments: $ cat foo.c main() {} $ cc -c foo.c $ ld -m foo.o /lib/crt0.o -lc LINK EDITOR MEMORY MAP output input virtual section section address size .text 80000 6c ^^^^^ >> The text is starting at this address .text 80000 14 foo.o .text 80014 2c crt0.o ^^^^^ >> The entry point is around here, which will fool file(1) .text 80040 18 libc.a .text 80058 08 libc.a .text 80060 0c libc.a *avail* 8006c ff94 .data 90000 00 uninitialized .bss 90000 08 uninitialized .bss 90000 08 crt0.o *avail* 90008 26eff8 $ file a.out a.out: mc68k executable (shared demand paged) not stripped -F (0413 demand paged) $ dump -h a.out ***SECTION HEADER*** Name Paddr Vaddr Scnptr Relptr Lnnoptr Flags Size Nreloc Nlnno a.out: .text 0x00080000 0x00080000 0x00000400 0x00000000 0x00000000 ^^^^^^^^^^ >> This is the offset of the .text section in the file. This means that >> the address for .text (above) should be 0x080400 for a -F file 0x00000020 0x0000006c 0 0 .data 0x00090000 0x00090000 0x00000000 0x00000000 0x00000000 0x00000040 0x00000000 0 0 .bss 0x00090000 0x00090000 0x00000000 0x00000000 0x00000000 0x00000080 0x00000008 0 0 Note that if you do "ld -m /lib/crt0.o foo.o -lc" you'll get exactly the same map as above; ie. our -F file is the same as a normal one. Oh well, back to the drawing board. :-( -- John R. MacMillan jrmacmillan@lily.waterloo.edu If the universe fits, wear it. ...!watmath!lily!jrmacmillan
jrmacmillan@watdragon.waterloo.edu (John R. MacMillan) (08/15/88)
A closer look at the a.out files shows that what you get if you don't give any flags to ld is the same as if you specify -z, so I guess the manual is wrong; -z, not -F, is on by default. -- John R. MacMillan jrmacmillan@dragon.waterloo.edu If the universe fits, wear it. ...!watmath!dragon!jrmacmillan