* Troubles with JIT compiler
@ 2010-01-22 4:12 Scott Sibley
2010-01-22 5:26 ` Robert Plantz
0 siblings, 1 reply; 8+ messages in thread
From: Scott Sibley @ 2010-01-22 4:12 UTC (permalink / raw)
To: linux-assembly
I'm debugging a script engine. The engine compiles expressions into
asm instructions, assigns that data to a function pointer, and
executes the function, passing one argument.
I'm new to assembly, and pretty much stuck on the first issue I ran into.
Here are the function's instructions for a basic assignment operation:
0x8067990: push %ebp
0x8067991: mov %esp,%ebp
0x8067993: sub $0x8,%esp
0x8067999: fnstcw (%esp)
0x806799c: mov (%esp),%eax
0x806799f: or $0xc00,%eax
0x80679a4: mov %eax,0x4(%esp)
0x80679a8: fldcw 0x4(%esp)
0x80679ac: flds 0x806793c
0x80679b2: fsts 0x805f014
0x80679b8: fstps 0x8067954
0x80679be: fldcw (%esp)
0x80679c1: add $0x8,%esp
0x80679c7: emms
0x80679c9: leave
0x80679ca: ret
Well, it appears to be crashing at the first instruction. Here are the
values of ebp and esp.
(gdb) x/x $ebp
0xbffff168: 0xbffff188
(gdb) x/x $esp
0xbffff14c: 0x0804e481
Any clue why this would cause problems? Let me know if I need to
provide more info.
--
To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 4:12 Troubles with JIT compiler Scott Sibley
@ 2010-01-22 5:26 ` Robert Plantz
2010-01-22 6:04 ` Scott Sibley
0 siblings, 1 reply; 8+ messages in thread
From: Robert Plantz @ 2010-01-22 5:26 UTC (permalink / raw)
To: Scott Sibley; +Cc: linux-assembly
On Thu, 2010-01-21 at 22:12 -0600, Scott Sibley wrote:
> I'm debugging a script engine. The engine compiles expressions into
> asm instructions, assigns that data to a function pointer, and
> executes the function, passing one argument.
>
> I'm new to assembly, and pretty much stuck on the first issue I ran into.
>
> Here are the function's instructions for a basic assignment operation:
>
> 0x8067990: push %ebp
> 0x8067991: mov %esp,%ebp
> 0x8067993: sub $0x8,%esp
> 0x8067999: fnstcw (%esp)
> 0x806799c: mov (%esp),%eax
> 0x806799f: or $0xc00,%eax
> 0x80679a4: mov %eax,0x4(%esp)
> 0x80679a8: fldcw 0x4(%esp)
> 0x80679ac: flds 0x806793c
> 0x80679b2: fsts 0x805f014
> 0x80679b8: fstps 0x8067954
> 0x80679be: fldcw (%esp)
> 0x80679c1: add $0x8,%esp
> 0x80679c7: emms
> 0x80679c9: leave
> 0x80679ca: ret
>
> Well, it appears to be crashing at the first instruction. Here are the
> values of ebp and esp.
>
> (gdb) x/x $ebp
> 0xbffff168: 0xbffff188
> (gdb) x/x $esp
> 0xbffff14c: 0x0804e481
>
An immediate problem I see is that the stack pointer is not properly
aligned. This is 32-bit code, and the Intel manual says that the stack
should be aligned at 32-bit addresses. That is, the least significant
digit in esp should be 0, 4, 8, or c.
I also note that the values in ebp and esp are very far apart.
Typically, they contain similar values -- addresses somewhere in the
stack.
I would look at how the stack was set up in this program.
--Bob
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 5:26 ` Robert Plantz
@ 2010-01-22 6:04 ` Scott Sibley
2010-01-22 7:01 ` Robert Plantz
0 siblings, 1 reply; 8+ messages in thread
From: Scott Sibley @ 2010-01-22 6:04 UTC (permalink / raw)
To: Robert Plantz; +Cc: linux-assembly
On Thu, Jan 21, 2010 at 11:26 PM, Robert Plantz <plantz@sonoma.edu> wrote:
> On Thu, 2010-01-21 at 22:12 -0600, Scott Sibley wrote:
>> I'm debugging a script engine. The engine compiles expressions into
>> asm instructions, assigns that data to a function pointer, and
>> executes the function, passing one argument.
>>
>> I'm new to assembly, and pretty much stuck on the first issue I ran into.
>>
>> Here are the function's instructions for a basic assignment operation:
>>
>> 0x8067990: push %ebp
>> 0x8067991: mov %esp,%ebp
>> 0x8067993: sub $0x8,%esp
>> 0x8067999: fnstcw (%esp)
>> 0x806799c: mov (%esp),%eax
>> 0x806799f: or $0xc00,%eax
>> 0x80679a4: mov %eax,0x4(%esp)
>> 0x80679a8: fldcw 0x4(%esp)
>> 0x80679ac: flds 0x806793c
>> 0x80679b2: fsts 0x805f014
>> 0x80679b8: fstps 0x8067954
>> 0x80679be: fldcw (%esp)
>> 0x80679c1: add $0x8,%esp
>> 0x80679c7: emms
>> 0x80679c9: leave
>> 0x80679ca: ret
>>
>> Well, it appears to be crashing at the first instruction. Here are the
>> values of ebp and esp.
>>
>> (gdb) x/x $ebp
>> 0xbffff168: 0xbffff188
>> (gdb) x/x $esp
>> 0xbffff14c: 0x0804e481
>>
>
> An immediate problem I see is that the stack pointer is not properly
> aligned. This is 32-bit code, and the Intel manual says that the stack
> should be aligned at 32-bit addresses. That is, the least significant
> digit in esp should be 0, 4, 8, or c.
>
> I also note that the values in ebp and esp are very far apart.
> Typically, they contain similar values -- addresses somewhere in the
> stack.
>
> I would look at how the stack was set up in this program.
>
> --Bob
>
>
>
Hey, Robert. Thanks for replying.
How can I look into how the stack's being setup? This is a C program
that's compiling
data as instruction code into a pointer, and casting that pointer to a
function pointer, then
calling that function pointer. So the C code is managing the stack if
I'm not mistaken.
Correct me if I'm wrong.
Here's where the instructions are compiled:
IL_CORE_COMPILE(avs_x86_compiler_compile)
{
X86GlobalData *gd = X86_GLOBALDATA(ctx);
ILInstruction *insn;
avs_debug(print("X86: Compiling started..."));
/* Initialize X86 Assembler opcode context */
x86_context_init(&gd->ctx, 4096, 1024*1024);
/* Compile function entrance, setup stack frame*/
x86_emit1(&gd->ctx, pushl, ebp);
x86_emit2(&gd->ctx, movl, esp, ebp);
/* Setup floating point rounding mode to integer truncation */
x86_emit2(&gd->ctx, subl, imm(8), esp);
x86_emit1(&gd->ctx, fstcw, disp(0, esp));
x86_emit2(&gd->ctx, movl, disp(0, esp), eax);
x86_emit2(&gd->ctx, orl, imm(0xc00), eax);
x86_emit2(&gd->ctx, movl, eax, disp(4, esp));
x86_emit1(&gd->ctx, fldcw, disp(4, esp));
for (insn=avs_il_tree_base(tree); insn != NULL; insn = insn->next) {
avs_debug(print("X86: Compiling instruction: %p", insn));
compile_opcode(gd, obj, insn);
}
/* Restore floating point rounding mode */
x86_emit1(&gd->ctx, fldcw, disp(0, esp));
x86_emit2(&gd->ctx, addl, imm(8), esp);
/* Cleanup stack frame */
x86_emit0(&gd->ctx, emms);
x86_emit0(&gd->ctx, leave);
x86_emit0(&gd->ctx, ret);
/* Link machine */
obj->run = (AvsRunnableExecuteCall) gd->ctx.buf;
avs_debug(print("X86: Compiling finished..."));
avs_debug(print("X86: Function: %p", obj->run));
return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 6:04 ` Scott Sibley
@ 2010-01-22 7:01 ` Robert Plantz
2010-01-22 7:16 ` Scott Sibley
0 siblings, 1 reply; 8+ messages in thread
From: Robert Plantz @ 2010-01-22 7:01 UTC (permalink / raw)
To: Scott Sibley; +Cc: linux-assembly
Very big oops here! See below.
> >>
> >> Well, it appears to be crashing at the first instruction. Here are the
> >> values of ebp and esp.
> >>
> >> (gdb) x/x $ebp
> >> 0xbffff168: 0xbffff188
> >> (gdb) x/x $esp
> >> 0xbffff14c: 0x0804e481
> >>
I misread your gdb display. I'm used to using the i r command to look in
the registers.
You used the x/x command, which shows the contents of the register, then
what it is pointing to.
So the values in ebp and esp DO look reasonable. That's the range I
expect in 32-bit program, and they are reasonably close to each other.
I apologize for my error.
From what you have posted, I don't see any problems with the first few
instructions. So I have no idea why the program is crashing there.
Sorry...
--Bob
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 7:01 ` Robert Plantz
@ 2010-01-22 7:16 ` Scott Sibley
2010-01-22 10:45 ` Scott Sibley
0 siblings, 1 reply; 8+ messages in thread
From: Scott Sibley @ 2010-01-22 7:16 UTC (permalink / raw)
To: Robert Plantz; +Cc: linux-assembly
On Fri, Jan 22, 2010 at 1:01 AM, Robert Plantz <plantz@sonoma.edu> wrote:
> Very big oops here! See below.
>
>
>> >>
>> >> Well, it appears to be crashing at the first instruction. Here are the
>> >> values of ebp and esp.
>> >>
>> >> (gdb) x/x $ebp
>> >> 0xbffff168: 0xbffff188
>> >> (gdb) x/x $esp
>> >> 0xbffff14c: 0x0804e481
>> >>
>
> I misread your gdb display. I'm used to using the i r command to look in
> the registers.
>
> You used the x/x command, which shows the contents of the register, then
> what it is pointing to.
>
> So the values in ebp and esp DO look reasonable. That's the range I
> expect in 32-bit program, and they are reasonably close to each other.
>
> I apologize for my error.
>
> >From what you have posted, I don't see any problems with the first few
> instructions. So I have no idea why the program is crashing there.
>
> Sorry...
>
> --Bob
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
Ah I see. Just for giggles here's the output of 'i r'
(gdb) i r
eax 0x8067888 134641800
ecx 0xbffff07c -1073745796
edx 0x8067990 134642064
ebx 0x970ff4 9900020
esp 0xbffff14c 0xbffff14c
ebp 0xbffff168 0xbffff168
esi 0x0 0
edi 0x0 0
eip 0x8067990 0x8067990
eflags 0x206 [ PF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
--
To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 7:16 ` Scott Sibley
@ 2010-01-22 10:45 ` Scott Sibley
2010-01-22 16:50 ` Robert Plantz
2010-01-22 17:19 ` Brian Raiter
0 siblings, 2 replies; 8+ messages in thread
From: Scott Sibley @ 2010-01-22 10:45 UTC (permalink / raw)
To: Robert Plantz; +Cc: linux-assembly
On Fri, Jan 22, 2010 at 1:16 AM, Scott Sibley <sisibley@gmail.com> wrote:
> On Fri, Jan 22, 2010 at 1:01 AM, Robert Plantz <plantz@sonoma.edu> wrote:
>> Very big oops here! See below.
>>
>>
>>> >>
>>> >> Well, it appears to be crashing at the first instruction. Here are the
>>> >> values of ebp and esp.
>>> >>
>>> >> (gdb) x/x $ebp
>>> >> 0xbffff168: 0xbffff188
>>> >> (gdb) x/x $esp
>>> >> 0xbffff14c: 0x0804e481
>>> >>
>>
>> I misread your gdb display. I'm used to using the i r command to look in
>> the registers.
>>
>> You used the x/x command, which shows the contents of the register, then
>> what it is pointing to.
>>
>> So the values in ebp and esp DO look reasonable. That's the range I
>> expect in 32-bit program, and they are reasonably close to each other.
>>
>> I apologize for my error.
>>
>> >From what you have posted, I don't see any problems with the first few
>> instructions. So I have no idea why the program is crashing there.
>>
>> Sorry...
>>
>> --Bob
>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>
> Ah I see. Just for giggles here's the output of 'i r'
>
> (gdb) i r
> eax 0x8067888 134641800
> ecx 0xbffff07c -1073745796
> edx 0x8067990 134642064
> ebx 0x970ff4 9900020
> esp 0xbffff14c 0xbffff14c
> ebp 0xbffff168 0xbffff168
> esi 0x0 0
> edi 0x0 0
> eip 0x8067990 0x8067990
> eflags 0x206 [ PF IF ]
> cs 0x73 115
> ss 0x7b 123
> ds 0x7b 123
> es 0x7b 123
> fs 0x0 0
> gs 0x33 51
>
After someone's tip, I found a solution to this. Passing the linker
'-z execstack' made it run, no problem. It's funny that Linux didn't
complain about it, but rather just seg-faulted.
--
To unsubscribe from this list: send the line "unsubscribe linux-assembly" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 10:45 ` Scott Sibley
@ 2010-01-22 16:50 ` Robert Plantz
2010-01-22 17:19 ` Brian Raiter
1 sibling, 0 replies; 8+ messages in thread
From: Robert Plantz @ 2010-01-22 16:50 UTC (permalink / raw)
To: Scott Sibley; +Cc: linux-assembly
On Fri, 2010-01-22 at 04:45 -0600, Scott Sibley wrote:
> After someone's tip, I found a solution to this. Passing the linker
> '-z execstack' made it run, no problem. It's funny that Linux didn't
> complain about it, but rather just seg-faulted.
> --
Thank you, Scott, for sharing the solution with us.
According to the man page for ld, that option "Marks the object as
requiring executable stack."
I don't know much about jit compilers, so I can't comment on the GNU
development environment not complaining about it. I do know that if
there is something we don't like about it, we can get double our money
back. :-)
--Bob
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Troubles with JIT compiler
2010-01-22 10:45 ` Scott Sibley
2010-01-22 16:50 ` Robert Plantz
@ 2010-01-22 17:19 ` Brian Raiter
1 sibling, 0 replies; 8+ messages in thread
From: Brian Raiter @ 2010-01-22 17:19 UTC (permalink / raw)
To: linux-assembly
> After someone's tip, I found a solution to this. Passing the linker
> '-z execstack' made it run, no problem. It's funny that Linux didn't
> complain about it, but rather just seg-faulted.
But the segfault is the complaint. What else would you hope for? In
general neither the compiler nor the linker has enough information to
reliably warn you of the issue before runtime.
It may also be worth noting that making stack memory non-executable by
default is a relatively recent change to Linux, done to ameliorate the
effectiveness of stack-based code exploits.
b
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2010-01-22 17:19 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-22 4:12 Troubles with JIT compiler Scott Sibley
2010-01-22 5:26 ` Robert Plantz
2010-01-22 6:04 ` Scott Sibley
2010-01-22 7:01 ` Robert Plantz
2010-01-22 7:16 ` Scott Sibley
2010-01-22 10:45 ` Scott Sibley
2010-01-22 16:50 ` Robert Plantz
2010-01-22 17:19 ` Brian Raiter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.