NASM Forum > Programming with NASM
Strange behaviour with a.out format
(1/1)
antoineL:
Hi folks,
I am having a strange behaviour with NASM with the "aout" object format.
I reduced it to the following testcase
--- Code: --- BITS 32
GLOBAL fwd_bwd
SECTION .text
fwd_bwd:
nop
jmp forward
backward: ret
SECTION .data
dd 1,2,3
forward:
jmp backward
nop
--- End code ---
The resulting bytes are disassembled as follow (using objdump, edited locally):
--- Code: ---00000000 <fwd_bwd>:
0: 90 nop
1: e9 0e 00 00 00 jmp 14 <forward>
2: DISP32 .data+0xfffffff8
00000006 <backward>:
6: c3 ret
7: 90 nop
Disassembly of section .data:
00000008 <forward-0xc>:
8: 01 00 add %eax,(%eax)
a: 00 00 add %al,(%eax)
c: 02 00 add (%eax),%al
e: 00 00 add %al,(%eax)
10: 03 00 add (%eax),%eax
...
00000014 <forward>:
14: e9 f5 ff ff ff jmp 6 <backward+0x8>
15: DISP32 .text
19: 90 nop
--- End code ---
However, comparing with another assembler, I believe the result should rather be
--- Code: ---00000000 <fwd_bwd>:
0: 90 nop
1: e9 0e 00 00 00 jmp 14 <forward>
2: DISP32 .data+0xfffffff8
00000006 <backward>:
6: c3 ret
7: 90 nop
Disassembly of section .data:
00000008 <forward-0xc>:
8: 01 00 add %eax,(%eax)
a: 00 00 add %al,(%eax)
c: 02 00 add (%eax),%al
e: 00 00 add %al,(%eax)
10: 03 00 add (%eax),%eax
...
00000014 <forward>:
14: e9 ed ff ff ff jmp 6 <backward>
15: DISP32 .text
19: 90 nop
--- End code ---
The problem is with the way the "jmp" instruction in the data section is encoded: it looks like Nasm forgets to adjust the emitted bytes in the .data section referenceing the .text section, failing (erroneously) to substracting to them the size of .text section, here 8. I got this impression from the quote below (from output/outaout.c)
--- Quote ---/*
* a.out files have the curious property that all references to
* things in the data or bss sections are done by addresses which
* are actually relative to the start of the _text_ section, in the
* _file_. (No relation to what happens after linking. No idea why
* this should be so. It's very strange.) So we have to go through
* the relocation table, _after_ the final size of each section is
* known, and fix up the relocations pointed to.
*/
static void aout_fixup_relocs(struct Section *sect)
--- End quote ---
What should be done here?
Antoine
H. Peter Anvin:
What platform are you seeing this on? a.out isn't widely used anymore...
antoineL:
Thanks for your attention.
--- Quote from: H. Peter Anvin on April 06, 2010, 09:06:02 PM ---What platform are you seeing this on? a.out isn't widely used anymore...
--- End quote ---
Here are the gory details, since you asked ;)
I am working on Minix 3, which is using an hybrid of the classical PC/IX a.out used for years, and the classical 4BSD a.out; and as you know, Minix is still alive and kicking, along with that unbearable perfume of nostalgia :).
But the reported problem is not with this breed of a.out (since Minix does not allow execution from .data, the test case is rather pointless, at the very least convoluted.)
Rather that, while testing my mods I created a more involved test case for any kind of relocation I could imagine, and found a difference here (with respect to binutils and 4BSD a.out); and furthermore my attention was drawn by the (quoted) comment, which I take as a hint that Nasm code could be improved. At the very least, the comment could be changed to really explain how a.out works.
Is there interest for that in the mainline of Nasm?
Navigation
[0] Message Index
Go to full version