Ok, when cp850/cp437 is compiled as static, config.h has following macro:
#define static_init_charset { charset_CP850_init();
charset_CP437_init();}

This static_init_charset macro gets called in iconv.c. But at this point
in the file there is no function prototype for charset_CP850_init and
charset_CP437_init. Thus gcc, doesn't know that it has to reserve space on
the stack for this 4 byte return value which actually gets returned AND
pushed to the stack by charset_CP850_init.

After adding following prototype to config.h, everything works as
expected:
NT_STATUS charset_CP850_init(void);

You may look at this disassembly which shows whats going wrong exactely: