Hello all, I have determined that the default exception handlers for uncaught exceptions, memory allocation failures, etc. that come pre-compiled in the libstdc++ library perform a write to 'stderr' when executed. This causes the linker to include 'open/read/write/close' along with a whole bunch of string functions and greatly adds to the code and data size. While there are run-time functions for redirecting these default handlers to point to user code, the pre-compiled routines still get linked in. Is there a way to extract the default handlers from the libstdc++ library and replace them with my own versions so that no stream IO is performed? If anyone knows how to do this or knows where to get docs discussing this in more detail, I'd appreciate it. Cheers! Daniel Quinz, P. Eng. Acacetus Inc.
Dan Quinz wrote: > Is there a way to extract the default handlers from the libstdc++ > library and replace them with my own versions so that no stream IO is > performed? I've been wondering this as well! I'd love to get rid of the exception handling stuff to free up some flash and ram space. I've been looking into it but haven't made any progress. Let me know if you find anything interest please. Thanks
Actually, now that I think about it, I want to removed exception handling entirely. For instance: 0x124 c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_alloc.o) 0x000196bc __cxa_free_exception 0x000196f8 __cxa_allocate_exception .text 0x000197e0 0x34 c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_call.o) 0x000197e0 __cxa_call_terminate .text 0x00019814 0x154 c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_catch.o) 0x0001981c std::uncaught_exception() 0x00019814 __cxa_get_exception_ptr 0x00019830 __cxa_end_catch 0x00019898 __cxa_begin_catch .text 0x00019968 0x7c c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_exception.o) 0x00019994 std::exception::~exception() 0x00019968 std::exception::what() const 0x000199d0 std::bad_exception::~bad_exception() 0x000199bc std::bad_exception::~bad_exception() 0x000199a0 std::bad_exception::~bad_exception() 0x00019988 std::exception::~exception() 0x00019974 std::exception::~exception() .text 0x000199e4 0x10 c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_globals.o) 0x000199e4 __cxa_get_globals_fast 0x000199ec __cxa_get_globals .text 0x000199f4 0x14 c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_type.o) 0x000199f4 __cxa_current_exception_type I do not need or want those. However, I have added -fno-exceptions and -fno-enforce-eh-specs to my makefile, and they still get included. Any one have any ideas?
Hi Jim, I have found a compile and link setup that seems to eliminate all teh exception handling code (as long as you don't use exceptions). Here it is: Compile: arm-elf-g++ -c -ffunction-sections -fdata-sections -fno-builtin -gdwarf-2 -O3 -Wall -Wcast-align -Wcast-qual -Wimplicit -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wunused -mno-sched-prolog -fno-rtti -fno-exceptions -mcpu=arm7tdmi -DXTAL_OSC=20000000 -DOS_USE_HOOK_CONTEXT=0 -DDBG_IMAGE=0 -DEXTERN_C_ENTER="extern \"C\" {" -DEXTERN_C_LEAVE="} ;" -I. -Iinc.device -Iinc.hw_lpc -Iinc.task -Iinc.void -Ilib.can -Ilib.clk_info -Ilib.dbg -Ilib.hw_can -Ilib.hw_uart -Ilib.iap -Ilib.info -Ilib.os -Ilib.os_lpc -Ilib.reset -Ilib.sio -Ilib.sio_uart -Ilib.sys -Ilib.task_main -Ilib.ui -Ilib.vic -Ilib.wdog -Ibin.main -Wa,-adhlns=lib.wdog/lib.lpc/wdog_reset.lst -MD -MP wdog_reset.cpp -o lib.lpc/wdog_reset.o Link: arm-elf-gcc -gdwarf-2 -O3 -MD -MP -nostartfiles -Wl,--gc-sections -mcpu=arm7tdmi -I. -Wa,-adhlns=main.lst crt0.o main.o --output main.elf -Wl,-Map=main.map,--cref -lstdc++ -lgcc -lc -lm -lnewlib-lpc -Tlpc2129.ld arm-elf-objcopy -O ihex main.elf main.hex arm-elf-objdump -h -S -C main.elf > main.lss arm-elf-nm -n main.elf > main.sym When I compile and link with these options, the executable for my little test program is only 2k with minimal RAM. This is small when compared to the original 40k+ FLASH and 2k+ RAM when exception handling is used. Hope this helps you. Cheers! Dan Jim Kaz wrote: > Actually, now that I think about it, I want to removed exception > handling entirely. For instance: > > 0x124 > c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_alloc.o) > 0x000196bc __cxa_free_exception > 0x000196f8 __cxa_allocate_exception > .text 0x000197e0 0x34 > c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_call.o) > 0x000197e0 __cxa_call_terminate > .text 0x00019814 0x154 > c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_catch.o) > 0x0001981c std::uncaught_exception() > 0x00019814 __cxa_get_exception_ptr > 0x00019830 __cxa_end_catch > 0x00019898 __cxa_begin_catch > .text 0x00019968 0x7c > c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_exception.o) > 0x00019994 std::exception::~exception() > 0x00019968 std::exception::what() const > 0x000199d0 > std::bad_exception::~bad_exception() > 0x000199bc > std::bad_exception::~bad_exception() > 0x000199a0 > std::bad_exception::~bad_exception() > 0x00019988 std::exception::~exception() > 0x00019974 std::exception::~exception() > .text 0x000199e4 0x10 > c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_globals.o) > 0x000199e4 __cxa_get_globals_fast > 0x000199ec __cxa_get_globals > .text 0x000199f4 0x14 > c:/winarm/bin/../lib/gcc/arm-elf/4.1.2/../../../../arm-elf/lib/thumb/int erwork\libstdc++.a(eh_type.o) > 0x000199f4 __cxa_current_exception_type > > > I do not need or want those. However, I have added -fno-exceptions and > -fno-enforce-eh-specs to my makefile, and they still get included. Any > one have any ideas?
Dan Quinz wrote: > When I compile and link with these options, the executable for my little > test program is only 2k with minimal RAM. This is small when compared > to the original 40k+ FLASH and 2k+ RAM when exception handling is used. > > Hope this helps you. > > Cheers! > > Dan Sweet! Thanks Dan! I'll try this out as soon as I get the chance, but sadly optimizing code space is the least of my concerns right now. So much to do and so little time... I hate deadlines :(
Jim, I also discovered that when you create an class object instance as a static variable within a function, the compiler will use dynamic memory allocation. This in turn can throw an exception, which links in all the additional stuff. If you declare the object as global or file-static, it does not. Keep that in mind! Ex: Object obj ; // Global, ok. static Object obj; // File static, ok. void some_func (void) { static Object obj; // Will call dynamic allocation -> bigger code!! Object obj; // No dynamic call, so ok. } Perhaps this is what is causing the stuff to be linked in your case? Cheers! Dan Jim Kaz wrote: > Dan Quinz wrote: >> When I compile and link with these options, the executable for my little >> test program is only 2k with minimal RAM. This is small when compared >> to the original 40k+ FLASH and 2k+ RAM when exception handling is used. >> >> Hope this helps you. >> >> Cheers! >> >> Dan > > Sweet! Thanks Dan! I'll try this out as soon as I get the chance, but > sadly optimizing code space is the least of my concerns right now. So > much to do and so little time... I hate deadlines :(
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.