![]() |
|
|
|
#1
|
|||
|
|||
|
Omitting unused global variables
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
}
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. |
|
#2
|
|||
|
|||
|
Although the MSDN doesn't directly say so, my guess would be that manually assigning a section the string shall be placed in (explicitly allocating the space) makes the linker think of it as something external - why would one want to explicitly allocate/assign it if not for specific reasons? You're taking the trouble, so the linker might assume you know what you're doing.
Or it's just due to some internal MS design issues no one will ever know more about. |
|
#3
|
|||
|
|||
|
The bevaviour is the same for variables without manual section assignment.
It would be interesting to know whether other versions of link behave in the same way. Unfortunately I uninstalled my 2008 Express install in favour of 2010 so I can't check myself.
|
|
#4
|
|||
|
|||
|
Well, tried on VC6 (link 6.00.8168): exactly the same behaviour,
even if I remove the three lines Code:
#pragma code_seg(SECTION_NAME) // push not understood #pragma comment(linker, "/SECTION:"SECTION_NAME",RWE") __declspec(allocate(SECTION_NAME)) Regards, bilbo |
|
#5
|
|||
|
|||
|
I think that this is based on the optimizer. If it isnt set properly then the code stayes in the obj file and thus it gets linked. This behaviour is at least not strange to me. I was more amazed that delphi does properly optimize more things out...
Anyway you should check the object file and you see it is one block of compiled code. Now if those two functions are in a second .c file and also compiler then they will not be linked indeed... |
![]() |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Armadillo Environment Variables Finder 1.2 | rukov | Community Tools | 3 | 12-16-2015 01:59 |
| 2004 Global Piracy Study | Shub-Nigurrath | General Discussion | 2 | 07-13-2004 20:51 |
| Tool to zero unused space??? | yaa | General Discussion | 1 | 10-09-2003 20:31 |