Hello GCC developer team,
I hope I am right here to address my problem with memory usage and g++:
 
I am writing C++ software for several very small embedded systems (8k and 
smaller) and a feature with the virtual tables and the linker does not make my 
life easy :-) I have a lot of objects with virtual functions, where not all of 
them are used in each application, but they remain existing in the source code.
Until now I could not find a way to get rid of them in the output elf/hex file 
automatically (they are not removed by the linker).
 
For better understanding an example:
 
The program:
int main()
{
    for(;;)
    {
     // Nothing to do
    }
    // unreachable code
    //return 0;
}

uses 62 bytes of flash and 0 bytes of RAM on an atmega8 µC (compiled with gcc 
4.9.2)
 
When I add a not used object with virtual functions (in the below listed 
example named as Derived0):
 
class CBase
{
public:
 virtual void virtFunction() = 0;
};

class CDerived : public CBase
{
public:
    virtual void virtFunction() { }
};
 
CDerived Derived0;
 
int main()
{
    for(;;)
    {
     // Nothing to do
    }
    // unreachable code
    //return 0;
}
 
the memory usage jumps up to 156 bytes flash and 8 bytes RAM usage (same 
compiler 4.9.2)
 
compiler and linker options are:
avr-g++.exe  -c -Os -Wall -fdata-sections -ffunction-sections 
-fvisibility=hidden -fvisibility-inlines-hidden -fno-rtti -flto 
-fuse-linker-plugin -mmcu=atmega8 ...
avr-gcc.exe  -Wall -Os -Wl,-static -Wl,-flto -fuse-linker-plugin 
-Wl,--strip-all -Wl,-s -Wl,--gc-sections -mmcu=atmega8 ...
 
The more not used objects I use the worse the problem gets.
 
Is there any possibility to remove unused virtual functions or at least the 
objects, which are not used? I have not find any solution so far.
If not, is there a plan to add this feature to the linker?
 
greetings from Austria
 
Stefan
 

Reply via email to