7
votes

C Compatibilité du fichier d'objet entre ordinateurs

D'abord, je tiens à indiquer pour l'enregistrement que cette question est liée à l'école / devoirs.

Disons que les ordinateurs CP1 et CP2 partagent tous les deux le même système d'exploitation et le même langage de la machine. Si un programme C est compilé sur CP1, afin de le déplacer vers CP2, est-il nécessaire de transférer le code source et de recompiler sur CP2 ou de transférer simplement les fichiers d'objet.

My Gut Réponse est que les fichiers d'objet doivent suffire. Le code C est traduit en assemblage par le compilateur et assemblé en code de machine par l'assembleur. Étant donné que l'architecture partage le même code de machine et le même système d'exploitation, je ne vois pas de problème.

Mais plus j'y pense, plus je commence à obtenir.

Mes questions sont:

a) Depuis sa référence à des fichiers d'objet et non aux exécutables, je suppose qu'il n'y a pas eu de liaison. Serait-il des problèmes qui sont en surface lors de la liaison sur CP2?

B) importerait-il si le code utilisé la norme C11 sur CP1 mais le seul compilateur sur CP2 était C99? Je suppose que cela n'est pas pertinent une fois que le code a été compilé / assemblé.

c) La question ne spécifie pas les bibliothèques liées partagées / dynamiques. Cela ne fonctionnerait donc que si le programme n'avait aucune dépendance sur les fichiers .dll / .so / .dylib, sinon ceux-ci seraient également requis sur le CP2.

Je me sens comme si de nombreux Gotchas et envisagent de savoir à quel point la question est vague que je pense que cela serait plus sûr de simplement recompiler.

halp!


1 commentaires

DISTCC, qui copie les fichiers d'objet entre ordinateurs, recommande d'utiliser la même version du compilateur sur tous les nœuds, même pour le langage C.


3 Réponses :


3
votes

La réponse est, cela dépend. Lorsque vous compilez un programme C et déplacez les fichiers d'objet pour lien sur un autre ordinateur, cela devrait fonctionner. Mais à cause de facteurs tels que Endiansness ou Nom Mangling , votre programme pourrait ne pas fonctionner comme prévu, et peut même s'écraser lorsque vous essayez de l'exécuter.

C11 n'est pas pris en charge par un compilateur C99 , mais cela n'a pas d'importance si la source a été compilée et assemblée.

Tant que la source est compilée avec les bibliothèques sur une machine, vous n'avez pas besoin des bibliothèques pour relier ou exécuter le (s) fichier (s) de l'autre ordinateur ( Bibliothèques statiques uniquement , dynamique Les bibliothèques devront être sur l'ordinateur que vous exécutez la demande). Cela dit, vous devez rendre le programme indépendant pour que vous ne rencontriez pas les mêmes problèmes qu'auparavant où le programme ne fonctionne pas comme prévu ou se bloque.

Vous pouvez obtenir un compilateur qui prend en charge EABI afin que vous ne rencontriez pas ces problèmes. Compilateurs prenant en charge le code d'objet EABI Créer le code compatible avec le code généré par d'autres compilateurs de ce type, permettant ainsi aux développeurs de relier les bibliothèques générées avec un compilateur avec un code d'objet généré avec un autre compilateur.

J'ai essayé de le faire avant, mais pas beaucoup de choses, et pas récemment. Par conséquent, mes informations peuvent ne pas être précises à 100%.


2 commentaires

"Vous n'avez pas besoin des bibliothèques" - c'est seulement vrai pour la liaison statique. Les libs dynamiques ne sont référencés que par votre programme, non compilées. Le programme ne démarre pas s'ils manquent.


Votre Rev 2 est essentiellement correct, vous devriez mentionner la notification de la compatibilité de Mangling et d'exécution, il existe des systèmes où vous pouvez réellement demander différents types de sorties de fichiers d'objet, car lorsqu'un nouveau ABI est tellement mieux que cela vaut la peine de réécrire à la boîte à outils de l'obtenir.



1
votes

a) J'ai déjà entendu le terme "fichiers d'objet" utilisé pour désigner des fichiers binaires liés - même s'il est un peu inexact. Alors peut-être qu'ils signifient "binaires". Je dirais que la liaison sur une autre machine pourrait être problématique s'il a un compilateur différent - À moins que les formats de fichier d'objet ne soient normalisés, ce que je ne suis pas sûr.

b) L'utilisation de normes différentes ou même compilateurs n'a pas d'importance pour le code binaire - s'il est lié de manière statique. S'il s'appuie sur des fonctions d'une LIB dynamique, il pourrait y avoir des problèmes. Quelles réponses c) aussi: Oui, ce sera un problème. Le programme ne démarre pas s'il n'a pas toutes requis libs dynamiques dans la version correcte. Dépend du mode de liaison (statique vs. dynamique), à ​​nouveau.


0 commentaires

0
votes

Q: Disons que les ordinateurs CP1 et CP2 partagent le même système d'exploitation et la même langue de la machine.

a: alors vous pouvez exécuter les mêmes .exe sur les deux ordinateurs

Q: Si un programme C est compilé sur CP1, afin de le déplacer vers CP2, est-il nécessaire de transférer le code source

A: Non. Vous n'avez besoin que du code source si vous souhaitez recompiler. Vous n'avez besoin que de recompiler s'il s'agit d'un processeur et / ou d'un système d'exploitation différent et incompatible.

"Les fichiers d'objet" ne sont généralement pas nécessaires pour l'exécution du programme:

http://en.wikipedia.org/wiki/Object_files

Un fichier d'objet est un fichier contenant du code de machine de format relocatifable Cela n'est généralement pas directement exécutable. Les fichiers d'objet sont produits par un assembleur, un compilateur ou un autre traducteur de langue, et utilisé comme entrée sur la liaison.

Un "programme exécutable" pourrait avoir besoin d'une ou de plusieurs "bibliothèques partagées" (AKA .DLL). Auquel cas, les mêmes restrictions s'appliquent: les bibliothèques partagées, si elles ne sont pas déjà résidieuses, doivent être copiées avec le .exe et doivent également être compatibles avec la CPU et le système d'exploitation.

Enfin, "scripts" font pas besoin d'être recompilé. Vous pouvez copier le script librement de l'ordinateur à l'ordinateur. Mais chaque ordinateur doit avoir un "interprète" pour exécuter le script: un script Perl a besoin d'un interprète Perl, d'un script Python un interprète python, et ainsi de suite.


0 commentaires