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)...