This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Asking help with (dwarf) exception hacking on mipsel


Hi,

I have the following target system:

- Mips cpu (QED R7000, wikipedia says RM7000)
- no linux environment, binaries can be compiled for the system with
binutils+gcc+newlib toolchain
- there are no debugging tools, only writing with printf to a console
- only static binaries are supported with one thread
- the final binaries are in a special ELF format of the target system
by help of some binutils scripts.
- the sources of the base target system is not available. e.g. I do
not have the codes or binaries how it loads the ELF binaries in
run-time.
- the final binaries must be linked against some closed-source "system
libraries". they are compiled with gcc 3.3.6. There is no possibility
to recompile them, the source code (closed-source) is not available
now and never in the future.
- the original toolchain is binutils 2.15+gcc 3.3.6+newlib 1.15.
- dwarf based exceptions work with gcc 3.3.6.

My final target to upgrade the toolchain with gcc 4.4.x to have the
-mplt optimization available, but at least I must get a gcc 4.x
compiler to work. So far I have partial success with updating the
toolchain to binutils 2.17+gcc 4.1.2+newlib 1.15:

- I can compile binaries with the gcc 4.1.2 toolchain and run on the
target system.
- the issue of the old gcc 3.3.6 based system libraries: I link my
programs with libgcc and libstdc++ from gcc 3.3.6 as well, but I
renamed the symbols in the old system libraries, in the old libgcc and
in the old libstdc++. The old target system libraries uses the old
libgcc and the old stdc++ calls, the new codes compiled with gcc 4.1.2
uses the new stdc++ and libgcc calls.
- it seems everything works fine except one thing: the exceptions. :(

I tried sjlj exceptions and dwarf based exceptions with gcc 4.1.2. The
dwarf based exceptions drop an abort, the sjlj based exceptions crash.
I look into the problems with dwarf exceptions.

The reason of the failure of the dwarf based exceptions: The
_Unwind_Find_FDE (context->ra - 1, &context->bases); call in
gcc/unwind-dw2.c does not find the fde for the given PC
(context->ra-1). The context-ra is set by __builtin_return_address(0)
call when calling uw_init_context_1().

I iterated through the fdes when it tries to find in
binary_search_unencoded_fdes() and the relevant information is in
place. The fdes show the correct information what is in the binary
file: e.g symbol address 0x40081c (0x400000+code address).

I wrote a small program with a simple class:

class A {
void c() { c2(); }

void c2() {
...
throw an exception
...
catch the exception
...
}
};

When I execute a simple program using an instance of class A:

- The return address is returned by __builtin_return_address(0) when
searching the fde: 0x2344eca7
- The address of the class A instance where the exception is thrown: 0x2336b330
- The address A::c2(): 0x2336b2dc

It is obvious that the return address (pc) will not be found in the
fdes, because the address space in the fdes completely different,
around 0x400000-0x500000. On the other hand, it also different from
the address range of the class instance A.

Unfortunately, I can not compare the unwinding process between gcc 3.x
and 4.x on the target platform, because if I include printf()s with
format in the source code of gcc 3.x, it crashes. :(

What is wrong here? Can somebody give some help to solve this problem?

Thanks in advance,
  Csaba


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]