struct A{virtual void foo();virtual void bar();};void A::foo() { } // keepvoid A::bar() { } // losestruct B : public A{virtual void foo();};void B::foo() { } // keepvoid _start() __asm__("_start"); // keepvoid start() __asm__("start"); // some toolchains use this name.A a; // keepB b;A *getme() { return &a; } // keepvoid _start(){getme()->foo();#ifdef __GNUC__#if (__GNUC__ == 2 && __GNUC_MINOR__ < 96)// gcc-2.95.2 gets this test wrong, and loses B::foo().// Cheat. After all, we aren't trying to test the compiler here.b.foo();#endif#endif}void start (){_start ();}// In addition, keep A's virtual table.// We'll wind up keeping `b' and thus B's virtual table because// `a' and `b' are both referenced from the constructor function.extern "C" void __main() { }