Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Mon programme "Hello world" ne link pas : "final link failed: Operation not supported"
    Bonjour, je viens de commencer à apprendre le C et premier programme le plus basique possible mais cela ne compile pas…

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
     
    int main(){
      printf("Hello world\n");
      return 0;
    }


    Après avoir essayé de lancer la compilation : gcc -o first.exe first.c, j'ai la magnifique erreur suivante :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    /usr/bin/ld: final link failed: Operation not supported
    collect2: error: ld returned 1 exit status


    Je ne pense pas que cela soit dû à mon code vu la simplicité de celui-ci et je sais que le problème vient du linker, mais bon : je ne sais quand même pas quoi faire. Si vous pouviez m'aider, ce serait cool.

  2. #2
    Modérateur

    Bonjour et bienvenue,

    Tu n'as pas de chance. Surtout avec un « hello world » qui, lui, est effectivement écrit dans les règles de l'art…
    Il semblerait qu'il s'agisse d'un bug rare mais déjà ancien, et ce que j'ai pu en lire jusqu'ici ne présentait que des solutions de contournement au cas par cas.

    Quelle plateforme utilises-tu pour développer ? Travailles-tu avec une vieille distribution de Linux, avec un CygWin ou avec les implémentations de Windows 10 ?

  3. #3
    Expert éminent sénior
    Bonjour

    De mon côté, avec une distrib ubuntu sur laquelle je suis en ce moment, j'ai fait exactement comme toi et ça a marché.

    En plus des infos demandées par Obsidian, il faudrait que tu nous donnes ta version de gcc => gcc --version

    Petit détail (qui n'entre pas en ligne ici mais que tu dois connaitre), sous Linux il n'y a pas besoin d'extension ".exe" pour un exécutable.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  4. #4
    Nouveau Candidat au Club
    Bonjour,
    Simple question : tu n'es pas sur un environnement virtualisé par hasard (VMware, WorkStation, ...) ?

  5. #5
    Futur Membre du Club
    deja merci de vos réponses (pour le .exe je suis aller faire un tour sur des sites montrant ça comme ça, dans le doute j'ai essayé bref)
    Je tourne sur Kali linux basé sur Debian 9.2.1 avec gcc 9.2.1 le tout installer sur une machine 32bits

  6. #6
    Expert éminent
    Je peux me tromper mais cela sent la compilation en 32 bits et l'édition des liens en 64 bits. D'où l'opération non supportée.

    Il faut regarder la version des bibliothèques que tu as installé (32 ou 64) voire la version de ton gcc (idem) et "mettre tout à niveau"

  7. #7
    Futur Membre du Club
    Citation Envoyé par foetus Voir le message
    Je peux me tromper mais cela sent la compilation en 32 bits et l'édition des liens en 64 bits. D'où l'opération non supportée.

    Il faut regarder la version des bibliothèques que tu as installé (32 ou 64) voire la version de ton gcc (idem) et "mettre tout à niveau"


    Ok, sur tes conseils j'ai vérifié et gcc est bien en i686 mais je n'arrive pas a voir pour le linker ça ne s'affiche pas avec un: ld -v

  8. #8
    Futur Membre du Club
    encore merci à tous, j'ai trouvé la solution, enfin non plus exactement : j'ai relancé la commande et je ne sais pas par quelle sorcellerie c'est possible mais ça marche nickel je passe donc la discussion en resolu

  9. #9
    Expert éminent sénior
    Citation Envoyé par iSeaox_ Voir le message
    encore merci à tous, j'ai trouvé la solution, enfin non plus exactement : j'ai relancé la commande et je ne sais pas par quelle sorcellerie c'est possible mais ça marche nickel
    Hum... je sens comme une espèce de collision foireuse avec un vieux ".o" résiduel qui aurait été utilisé par le linker à la place du source montré dans ce post. Ou alors un truc qui traine dans /tmp et fout la zone quand tu tentes de compiler. Puis tu rebootes ta machine (ce qui purge /tmp) et là tu compiles et ça marche...

    PS: est-ce que par hasard tu bosses sous root ?
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Futur Membre du Club
    Citation Envoyé par Sve@r Voir le message
    PS: est-ce que par hasard tu bosses sous root ?
    Oui, je sais que c'est pas l'ideal mais ça ne m'a causer aucun problème pour l'instant, pourquoi ?

  11. #11
    Modérateur

    Citation Envoyé par iSeaox_ Voir le message
    Oui, je sais que c'est pas l'ideal mais ça ne m'a causer aucun problème pour l'instant, pourquoi ?
    Si tu travailles sous Unix ou ses dérivés, il faut prendre d'emblée l'habitude de ne pas le faire.

    « root » n'est pas une sorte « power user » comme sous Windows. C'est plutôt une sorte de compte « technique ». Le fait d'en faire un utilisateur à part entière permet à la fois de largement simplifier les choses au niveau de la conception du système et de servir de fait « d'interface utilisateur ». Mais pour le reste, il y a un seul root, l'utilisateur avec l'identifiant « 0 », et tous les autres sont des utilisateurs ordinaires.

    Lorsque tu travailles en root, TOUTES les restrictions au niveau du système sont levées, y compris les systèmes de sécurité, jusqu'au l'exécution en mode privilégié sur le micro-processeur. Par défaut, les logiciels « système » et les services, qui ont une portée globale et qui doivent être accessibles à tout moment par tous les utilisateurs, fonctionnent en root… à condition de ne pas pouvoir faire autrement. Quand ils peuvent rendre ces mêmes services sans avoir besoin de privilèges, on les lance sous une identité qui correspond en fait à un utilisateur ordinaire. Il s'agit généralement d'un « pseudo-user » mais sous Unix, cette distinction est purement politique (par exemple, on décide que tous les UID inférieurs à 500 ou à 1000 serviront à ce type d'utilisateurs), mais pas technique.

    En outre, beaucoup d'adaptations sont faites pour que tu puisses utiliser root pour dépanner un système qui ne fonctionne plus en conditions normales. Par exemple, « /home », qui contient les répertoires personnels de tous les utilisateurs, est généralement monté sur une partition distincte, qui peut être facilement sauvegardée ou construite d'une façon particulière (en RAID, par exemple). Cela fait que l'on trouve tous les répertoires personnels au même niveau : « /home/pierre », « /home/jacques », « /home/paul », etc.

    À l'inverse, le home de root est généralement placé sur la partition qui contient la racine « / », donc « /root ». C'est volontaire, car cela permet justement de se loguer très tôt après le démarrage, c'est-à-dire quand le système arrive à booter, mais ne peut plus aller plus loin. Ça lui permet entre autre de pouvoir manuellement monter ou démonter la partition /home. C'est utile également quand le système utilise un système d'authentification tiers qui ne marche ou alors quand on a oublié le fichier /etc/nologin…

    A contrario, un système ouvert en root est extrêmement vulnérable : il suffit de taper « rm -rf / » pour effacer la totalité des volumes montés (système et répertoires utilisateur). Autre cas, l'espace disque : les partitions sont généralement configurées pour se déclarer pleines dès que l'espace disque tombe en dessus d'un certain pourcentage (5%, 1%… on a tendance à réduire ce seuil au fur et à mesure que les volumes grandissent). Un script qui devient fou et blinde un fichier de log ne fera que peu de dégats s'il fonctionne avec une identité normale : on ne pourra plus écrire mais il restera toujours un fond de roulement minimum pour que le système puisse fonctionner). Si tu fais la même chose sous root, ton script aura le droit de consommer cet espace de sécurité et le fera en plus sur la partition système.

    Côté utilisateur maintenant : si tous les utilisateurs sont a priori « égaux » sous Unix quand on les crée, il est extrêmement facile de leur accorder tous les privilèges que l'on souhaite et dont on a besoin pour travailler au quotidien : nul besoin de les faire rentrer dans des classes prédéfinies comme il en existait sous Windows. En principe, sous Unix, « tout est fichier », y compris les « fichiers spéciaux » et les partitions virtuelles comme « /proc », si bien que donner un droit d'accès à telle ou telle ressource matérielle est aussi simple que donner un droit d'accès à un fichier ordinaire. Bon, c'est de moins en moins vrai avec les distributions récentes et avec les projets de bureau (Freedesktop, le projet GNOME, etc) qui font du libre, mais qui n'ont pas spécialement décidé de s'appuyer sur le modèle Unix.

    Enfin, il faut se souvenir qu'il est très simple de lancer un logiciel sous une identité donnée dans un shell Unix sans avoir à fermer et rouvrir une session. C'est à ça que sert la commande « su » (Substitute User) et la plupart des gens utilisent en fait aujourd'hui « sudo » pour lancer au cas par cas une commande avec l'identité root par défaut (sinon n'importe quel autre utilisateur) et continuer à travailler en conditions normales à côté.

  12. #12
    Expert éminent sénior
    Citation Envoyé par iSeaox_ Voir le message
    Oui, je sais que c'est pas l'ideal mais ça ne m'a causer aucun problème pour l'instant, pourquoi ?
    En plus de l'excellente explication d'Obsidian, il faut te souvenir que tu bosses aussi pour les autres. Même si t'es seul, ta philosophie de dev Linux est (ou devrait être, ou "devra" être si demain tu bosses en équipe) que tes programmes doivent être utilisables par tout user. C'est à dire qu'ils doivent prendre en compte et gérer les soucis de droits d'accès ou autre. Et si tu bosses sous root, tes soucis éventuels seront masqués par tes droits privilégiés mais que les autres n'auront peut-être pas.

    C'est tellement préconisé de partout de ne jamais bosser sous root que certains services et/ou outils refusent carrément d'être lancé sous root. Par exemple Apache, le serveur web, dans lequel tu peux paramétrer son uid et gid, refuse de se lancer si son uid est à 0. Et (autre exemple) le shell "/bin/bash" détecte un setuid positionné et désactive son effet au lancement (j'ai découvert ça il y a 15 jours quand j'ai voulu faire un TP sur le setuid avec un groupe que je dirigeais => j'ai pris /bin/bash comme exemple et ça n'a pas marché ; puis j'ai pris /bin/sh et là c'était bon)

    Et accessoirement si j'ai posé la question, c'est parce que j'avais l'intuition que cette habitude avait ici peut-être eu un impact sur tes soucis de compilation...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  13. #13
    Futur Membre du Club
    Déja encore merci pour vos super explications et je commence de plus en plus à me dire qu'il faudrait que j'appronfondisse le sujet pas seulement l'utilisateur root mais linux dans sa globalité car à la base j'avais juste vu que pour de vieux ordinateurs, linux pouvait donner un coup de "boost". Ducoup je me suis juste rapidement renseigné sur les choses dont j'avais besoin sur le moment breff... Vous auriez des pistes pour m'aider à comprendre plus en profondeur le fonctionnement de linux ? : je me doute que ça va pas être facile mais ça vaut bien le coup

    Et ducoup jvais de ce pas aller me logger sur un autre user hehe

###raw>template_hook.ano_emploi###