gcc 4.3.2 libgcc_s.so exception handling broken?
xorquewasp at googlemail.com
xorquewasp at googlemail.com
Sat Jan 17 23:19:28 PST 2009
On 2009-01-18 07:39:51, Christoph Mallon wrote:
>
> Are more C functions involved? E.g. is the function pointer passed to
> qsort(), which lives in libc, which is not compiled with -fexceptions.
> Look at the stack trace when the exception occurs. In gdb you can use the
> command "catch throw" (sic) to break when an exception gets thrown.
> Conversely you can break at the catcher with "catch catch" (if it gets this
> far).
Unfortunately not. That was the first thing I looked at.
Here's the complete test:
/* c_function.c */
#include <stdio.h>
void
c_function (void (*func)(int x))
{
printf ("-- %s enter\n", __func__);
func (23);
printf ("-- %s exit\n", __func__);
}
-- ada_main.adb
with interfaces.c;
with ada.text_io;
procedure ada_main is
package c renames interfaces.c;
test_error : exception;
procedure ext_function
(x : in c.int) is
begin
ada.text_io.put_line ("-- ext_function " & c.int'image (x));
raise test_error;
end ext_function;
procedure c_function
(process : access procedure (x : in c.int));
pragma import (c, c_function, "c_function");
begin
ada.text_io.put_line ("-- ada_main entry");
c_function (ext_function'access);
exception
when test_error =>
ada.text_io.put_line ("-- ada_main caught test_error");
end ada_main;
Compilation:
gcc43 -o c_function.o -c c_function.c -fPIC -fexceptions -g -W -Werror -Wall -std=c99 -pedantic-errors -Wno-unused-parameter
gcc43 -shared -Wl,-soname,c_function.so -o c_function.so c_function.o -lc
gcc43 -o ada_main.o -c ada_main.adb -g -fstack-check -gnatwaleFG -gnatVa -gnato -gnata
gnatbind ada_main.ali
gnatlink -o main-dynamic ada_main.ali c_function.so
gnatbind ada_main.ali
gnatlink -o main-static ada_main.ali c_function.o
$ LD_LIBRARY_PATH=. ldd c_function.so
c_function.so:
libc.so.6 => /lib/libc.so.6 (0x2807d000)
libgcc_s.so.1 => /usr/local/lib/gcc-4.2.3/libgcc_s.so.1 (0x28170000)
Test:
$ ./main-static
-- ada_main entry
-- c_function enter
-- ext_function 23
-- ada_main caught test_error
$ LD_LIBRARY_PATH=. ./main-dynamic
-- ada_main entry
-- c_function enter
-- ext_function 23
raised ADA_MAIN.TEST_ERROR : ada_main.adb:15
$ LD_LIBRARY_PATH=. gdb68 ./main-dynamic
(gdb) catch exception
Catchpoint 1: all Ada exceptions
(gdb) b __gnat_os_exit
Breakpoint 2 at 0x805851b: file adaint.c, line 2116.
(gdb) r
Catchpoint 1, ADA_MAIN.TEST_ERROR at 0x08049cda in ada_main.ext_function (x=23) at ada_main.adb:15
15 raise test_error;
(gdb) bt
#0 <__gnat_debug_raise_exception> (e=0x8061168) at s-except.adb:48
#1 0x0804b620 in <__gnat_raise_nodefer_with_msg> (e=0x8061168) at a-except.adb:830
#2 0x0804b698 in <__gnat_raise_exception> (e=0x8061168, message=0x8061168) at a-except.adb:870
#3 0x08049cda in ada_main.ext_function (x=23) at ada_main.adb:15
#4 0x280927ae in c_function (func=0x8049bf8 <ada_main.ext_function>) at c_function.c:9
#5 0x08049b5c in ada_main () at ada_main.adb:24
(gdb) c
Breakpoint 2, __gnat_os_exit (status=1) at adaint.c:2116
(gdb) bt
#0 __gnat_os_exit (status=1) at adaint.c:2116
#1 0x0805a41e in __gnat_unhandled_terminate () at raise.c:78
#2 0x0805a1f1 in <__gnat_last_chance_handler> (except=@0x8071000) at a-elchha.adb:138
#3 0x0804ae14 in ada.exceptions.exception_traces.unhandled_exception_terminate () at a-exextr.adb:175
#4 0x0804aad2 in ada.exceptions.exception_propagation.cleanupunwind_handler (uw_version=1, uw_phases=10, uw_eclass=5138137877735301376, uw_exception=0xa, uw_context=3217024852, uw_argument=0, <uw_exceptionF>=134587758) at a-exexpr.adb:369
#5 0x0805c282 in _Unwind_ForcedUnwind_Phase2 (exc=0x806f000, context=0xbfbfe754) at ../.././..//gcc-4.3.2/libgcc/../gcc/unwind.inc:168
#6 0x0805c4d6 in _Unwind_Resume (exc=0x806f000) at ../.././..//gcc-4.3.2/libgcc/../gcc/unwind.inc:237
#7 0x08049cfa in ada_main.ext_function (x=23) at ada_main.adb:16
#8 0x280927ae in c_function (func=0x8049bf8 <ada_main.ext_function>) at c_function.c:9
#9 0x08049b5c in ada_main () at ada_main.adb:24
More information about the freebsd-hackers
mailing list