Global variables between C and C++

As Olaf said in a comment, you did not declare your string table as constant. So it is considered by the compiler/linker as initialized read/write data, instead of read only data.

Maybe your initialization code (executed before the main entry point) does not properly copy the initialized data from flash to RAM.

As a quick fix, try to make your string table as constant:

char const * const strings[] = {"string a", "string b", "string c" };

If it works, you could then investigate memory initialization issues... Have a look to the -nostartfiles argument given to the linker, which may probably disable the startup code (to be confirmed)...