2017-07-19 3 views
0

Je travaille actuellement avec Mach-O Executables sur mon Mac et une question vient de me tomber dessus, Est-ce qu'un seul fichier exécutable Fat Mach-O peut avoir plusieurs objectifs? Par exemple.Fat Mach-O Exécutable Multi-usage?

pourrais-je avoir un seul fichier exécutable Mach-O avec un en-tête Fat spécifiant 2 Exécutables:

Executable 1: Cet exécutable peut être une bibliothèque dynamique permettant son code à charger dans des applications externes.

et

Executable 2: Cet exécutable peut être un exécutable permettant d'être lancé indépendamment par le terminal ou comme une application.

Je veux juste savoir, pourrait-il être possible d'avoir 2 exécutables avec des fonctions complètement différentes dans un seul fichier binaire Mach-O?

Répondre

2

Oui c'est possible, mais peu utile. Avant d'en arriver pourquoi, voici comment créer un:

Prenez ce fichier C:

#ifdef __LP64__ 
int main(void) 
#else 
int derp(void) 
#endif 
{ 
    return 123; 
} 

Compile comme un exécutable 64 bits et une bibliothèque partagée 32 bits:

gcc -o t t.c -Wall 
gcc -m32 -o t.dylib -Wall t.c -shared 

Et les écraser ensemble:

lipo -create -output t.fat t t.dylib 

maintenant, pourquoi est-ce censé ne pas être utile? Parce que vous êtes limité à un binaire par architecture et que vous n'avez que peu ou pas de contrôle sur la tranche utilisée.
En théorie, vous pouvez avoir des tranches pour toutes ces architectures dans le même binaire gras:

  • i386
  • x86_64
  • x86_64h
  • ARMv6
  • armv6m
  • ARMv7
  • armv7s
  • armv7k
  • armv7m
  • arm64

Vous pourrait briser un exécutable, un dylib, un agent de liaison et une extension du noyau en un binaire gras, mais vous auriez du mal à obtenir quelque chose d'utile en sortir .
Le plus gros problème est que l'OS choisit quelle tranche charger. Pour les exécutables, ce sera toujours la correspondance la plus proche pour le processeur que vous utilisez. Pour les dylibs, dylinkers et kexts, il sera d'abord déterminé si le processus dans lequel ils vont être chargés est de 32 ou 64 bits, mais une fois cette distinction faite, là aussi vous obtiendrez la tranche la plus proche de celle de votre CPU. capacités.

J'imagine que sur Mac OS X 10.5, vous auriez pu avoir un binaire 64 bits avec un kext 32 bits qu'il pourrait essayer de charger. Cependant, en dehors de cela, je ne peux pas penser à un cas d'utilisation pour cela.