Microsoft KB Archive/123989

{|
 * width="100%"|

PRB: Causes and Resolutions for Error RW4005

 * }

Q123989

-

The information in this article applies to:


 * Microsoft C/C++ for MS-DOS
 * Microsoft Visual C++, versions 1.0, 1.5

-

SYMPTOMS
The following error is generated by the resource compiler (RC):

warning RW4005: Segment XX (offset XXXX) contains a relocation record pointing to the automatic data segment. This will cause the program to crash if the instruction being fixed up is executed in a multi-instance application. If this fixup is necessary, the program should be restricted to run only a single instance.

CAUSE
This error results when a fix-up record attempts to fix DGROUP, the data segment created by the C run-time, in the code segment of an application that might have multiple instances. Because Windows version 3.1 cannot fix locations that are different from instance to instance in shared code segments, this error is generated.

RESOLUTION
Here are five possible causes and solutions:


 * 1) Your program is not suitable for running multiple instances. The program has a fix-up record that references the data segment or DGROUP. In a multiple instance application, this causes problems because every instance of the application references that same data segment. Typically, there are no fix-ups from the data segment because DS will contain the data segment value.

Remember that there is no guarantee that you will be able to create multiple instance large model applications by using the /Gx compiler switch, especially if you have global C++ class objects. See the documentation for this compiler switch for more information.
 * 1) This warning has been reported to be caused by a reference to '__fac' made by the C/C++ version 7.0 compiler. The code does not make a reference to DS to access static data but to a constant value that is fixed-up when the code is loaded. No such reports have connected the same problem with Visual C++.

If DS can be loaded with a different value when a second instance of an application is run, the code can be reused without crashing. In the version of the code which uses the constant value for referencing data, the second instance of an application might write over the first instance's data.

The reported solution to this problem is to turn off the fast compile option. (Use the /f- switch to specify the full optimizing compiler instead.) This should stop the compiler from referencing the constant.
 * 1) The /GD compile switch optimizes prolog and epilog code for functions in DLL files and is inappropriate for use when compiling modules for applications (EXE files). Removing the /GD compiler switch should correct the problem.
 * 2) This warning can be reproduced by creating a function that uses the __loadds keyword or some inline assembly code that loads the segment of DGROUP into a register.
 * 3) If you have a DATA MULTIPLE statement in your .DEF file, change it to DATA SINGLE. This will allow only one copy of the data segment to exist. NOTE: Putting the code into a DLL would have the same effect.

Additional query words: 1.00 1.50 3.10 7.00 errmsg err msg

Keywords : kb16bitonly kbprb

Issue type : kbprb

Technology : kbVCsearch kbAudDeveloper kbPTProdChange kbvc150 kbvc100 kbZNotKeyword3