Pregunta

Después de la adición de la bandera enlazador / tsaware a uno de mis proyectos (Visual Studio 6), que se sorprendió al encontrar una nueva sección en el archivo PE (.idata). Si no fija la bandera, las importaciones se fusionan en .rdata.

Para ilustrar el "problema" comenzamos con un simple programa de consola:

#include <stdio.h>
int main() 
{
    printf("hello world\n");
    return 0;
}

y compilar con: cl /Og /O1 /GF /WX /c main.c

A continuación, enlace con

  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj

Vamos a comparar la salida dumpbin:

Dump of file a.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        1000 .rdata
        5000 .text

Dump of file b.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        1000 .idata
        1000 .rdata
        5000 .text

Así que, por alguna razón, el enlazador decide que las importaciones no se pueden combinar.

Pero si corremos editbin /TSAWARE a.exe sólo el campo características DLL en el encabezado opcional PE se cambia.

Puede alguien explicar esto a mí? Es esto un error en el conector o el ejecutable puede cambiado por Editbin terminan por no trabajar en ciertos sistemas?

¿Fue útil?

Solución

Sólo una conjetura: en un sistema de servidor de terminales, que desea una imagen para tener unas cuantas páginas escritas a como sea posible. Si una página de memoria que corresponde a la imagen no se modifica, una página de memoria RAM física puede ser asignada a una sesión eash que está utilizando esa imagen. Si se modifica una página de una imagen, el sistema tiene que realizar una operación de copia en escritura para cada instancia de la página entre todas las sesiones y el uso de un bloque diferente de la memoria física para representar la página en cada sesión.

Dado que las importaciones de una imagen a menudo necesitan ser arreglado si el archivo DLL que se está importando había que ser reubicados, las páginas que contienen las importaciones a menudo quedan modificados y por lo tanto no pueden participar en el intercambio entre las sesiones. Si el enlazador combina las importaciones con otros datos que por lo general no se modifica, podría aumentar el número de páginas de copia en escritura innecesariamente.

Esto puede ser una especie de optimización que ayuda a reducir el número de páginas copiadas a través de sesiones.

Como dije, aunque -. Esto es puramente una suposición

Otros consejos

El comentario de @WarrenP es correcta. De acuerdo con la MSDN la documentación :

  

La opción / tsaware establece un indicador en el IMAGE_OPTIONAL_HEADER   DllCharacteristics campo en el encabezado opcional de la imagen del programa. Cuando   se establece este indicador, Terminal Server no hará que ciertos cambios en el   aplicación.

     

Cuando una aplicación no es consciente de Terminal Server (también conocido como   aplicación legacy), Terminal Server hace que ciertas modificaciones a   el uso de la herencia para que funcione correctamente en un multiusuario   ambiente. Por ejemplo, Terminal Server creará un Portal   carpeta de Windows, de manera que cada usuario tiene una carpeta de Windows en lugar de   consiguiendo directorio de Windows del sistema. Esto ofrece a los usuarios el acceso a   sus propios archivos INI. Además, Terminal Server hace que algunos   ajustes en el registro para una aplicación antigua. Estas   modificaciones ralentizan la carga de la aplicación heredada en Terminal   Servidor.

     

Si una aplicación es consciente de Terminal Server, que no debe ni se basan en   archivos INI ni escribir en el registro HKEY_CURRENT_USER durante la instalación.

     

Si utiliza / tsaware y su aplicación todavía utiliza los archivos INI, las   archivos serán compartidos por todos los usuarios del sistema. Si eso es   aceptable, todavía se puede enlazar la aplicación a / tsaware;   de lo contrario es necesario utilizar / tsaware:. NO

Una cosa solamente insinuado aquí es que las teclas sombra sólo están disponibles para los procesos que no están al tanto de TS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top