Just for grins, instantiate the objects as globals.
It is part of newlib.
I am fairly certain that objects instantiated within the scope of a function are not really placed on the stack. Malloc is called to create the object and then destroyed when the function goes out of scope. main() is a function. Hence, the compiler added the malloc functions.
__impure_ptr
it has to do with reentrancy. You cannot remove it because it is used for more than that, but I believe you can shrink it by building newlib with the following option
--enable-newlib-reent-small
also see
[RTOS Support] _impure_ptr not setup when entering first task