Qu'est-ce que le drapeau de linker / TSAWARE faire à l'exécutable PE?
-
12-09-2019 - |
Question
Après avoir ajouté le drapeau de linker / TSAWARE à l'un de mes projets (Visual Studio 6), je fus surpris de trouver une nouvelle section dans le fichier PE (.idata). Si je ne mets pas le drapeau, les importations sont fusionnées en .rdata.
Pour illustrer le « problème » nous commençons avec un programme simple de la console:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
et compiler avec: cl /Og /O1 /GF /WX /c main.c
lien Puis, avec
-
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
-
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj
Comparons la sortie 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
Donc, pour une raison quelconque, l'éditeur de liens décide que les importations ne peuvent pas être fusionnés.
Mais si nous courons editbin /TSAWARE a.exe
seul le champ des caractéristiques de DLL dans l'en-tête en option PE est modifiée.
Quelqu'un peut-il me l'expliquer? Est-ce un bogue dans l'éditeur de liens ou peut l'exécutable modifié par EDITBIN finissent par ne fonctionne pas sur certains systèmes?
La solution
Seule une estimation: sur un système de serveur de terminal, vous voulez une image pour avoir quelques pages écrites que possible. Si une page de mémoire qui correspond à l'image ne soit pas modifiée, une seule page de RAM physique peut être mis en correspondance la session eash qui utilise cette image. Si une page à partir d'une image est modifiée, le système doit effectuer une opération de copie en écriture pour chaque instance de la page parmi toutes les sessions et utiliser un autre bloc de mémoire physique pour représenter la page dans chaque session.
Étant donné que les importations pour une image doivent souvent être retapent si la DLL qui est en cours d'importation ont dû être déplacés, les pages qui contiennent les importations souvent sont modifiés et ne peuvent donc pas participer au partage entre les sessions. Si l'éditeur de liens fusionne les importations avec d'autres données qui sont généralement pas modifiées, il pourrait augmenter le nombre de pages de copie en écriture inutilement.
Cela peut être une sorte d'optimisation qui permet de réduire le nombre de pages copiées entre les sessions.
Comme je l'ai dit bien -. Cela est purement une estimation
Autres conseils
Le commentaire de @WarrenP est correcte. Selon le documentation MSDN :
L'option / TSAWARE définit un indicateur dans le IMAGE_OPTIONAL_HEADER champ DllCharacteristics en-tête en option de l'image du programme. Quand ce drapeau est défini, Terminal Server ne sera pas apporter certaines modifications à la application.
Lorsqu'une application ne connaît pas Terminal Server (également connu sous le nom application héritée), Terminal Server fait certaines modifications l'application héritée pour le faire fonctionner correctement dans un multi-utilisateur environnement. Par exemple, Terminal Server va créer un virtuel dossier Windows, de sorte que chaque utilisateur obtient un dossier Windows au lieu de obtenir le répertoire système de Windows. Cela donne aux utilisateurs l'accès à leurs propres fichiers INI. En outre, Terminal Server fait une ajustements au Registre pour une application héritée. Celles-ci modifications ralentissent le chargement de l'application héritée sur Terminal Serveur.
Si une application Terminal Server est conscient, il ne doit ni compter sur les fichiers INI ni écrire dans le Registre HKEY_CURRENT_USER lors de l'installation.
Si vous utilisez / TSAWARE et votre application utilise toujours les fichiers INI, les les fichiers seront partagés par tous les utilisateurs du système. Si tel est acceptable, vous pouvez lier encore votre application avec / TSAWARE; sinon vous devez utiliser / TSAWARE:. NON
Une chose seulement à se faire ici est que les clés d'ombre ne sont activées que pour les processus qui ne sont pas au courant TS.