¿Qué hace la bandera enlazador / tsaware hacer al ejecutable PE?
-
12-09-2019 - |
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?
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.