Recently I came across somewhat strange (?) behaviour of Microsoft's link.exe (10.00.30319.01).
Code:
#include <stdio.h>
#define SECTION_NAME ".4711"
#pragma code_seg( push, r1, SECTION_NAME )
#pragma comment( linker, "/SECTION:"SECTION_NAME",RWE" )
__declspec(allocate(SECTION_NAME)) const char pString[] = "Blaaaaahhhhhhhh";
void TestFunc2()
{
printf( __FUNCTION__"\n" );
}
void TestFunc()
{
#if 1
printf( __FUNCTION__"\n" );
#endif
#if 1
printf( __FUNCTION__": %s\n", pString );
#endif
TestFunc2();
}
#pragma code_seg( pop, r1 )
void main()
{
#if 0
TestFunc();
#endif
}
Based off my understanding of the linking process, the linker should not put TestFunc, TestFunc2 and pString into the executable image since there's no path from the entrypoint which leads to code that references them.
The linker does indeed omit TestFunc and TestFunc2, but it puts pString into the image unless I disable the reference in TestFunc.
So my question is if that's intended, correct behaviour or if this is some kind of bug in link.exe and if someone possibly knows a workaround.
Thanks in advance.
BTW The code was compiled/linked with /O2 /Ob0 /Oy and /OPT:REF.