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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top