IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C Discussion :

dlopen et variable globales, étrange.


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut dlopen et variable globales, étrange.
    Salut,

    J'ai un écrit un code composé d'un exe et d'une lib dynamique qui fonctionne depuis un moment sans problème sur Linux et Windows. Je viens de recompiler l'ensemble avec gcc 4.4.5 et mon code ne fonctionne plus sur Linux. Après quelques investigations, je me rend compte que ma lib accède à une variable global de l'exe alors que je ne lui ai jamais demandé .

    J'ai écris un petit exemple de quelques lignes pour mettre en évidence mon problème.
    - Dans les 2 modules (exe et lib) je déclare une structure avec le même nom "g_test".
    - Je compile les 2 modules avec -fPic et -shared pour la lib
    Lorsque dans la lib je modifis "g_test" c'est le "g_test" de l'exécutable qui est modifié.

    Bref le symbole est partagé par défaut ce qui me surprend énormément pour pas dire que ca m'inquiète...c'est la première fois que je rencontre un tel problème, est ce que quelqu'un peut m'éclairer ?

    (Voir la pièce jointe "dlopen.tar.gz" pour reproduire le problème : faire un "make" puis lancer "./exedltest")

    Merci d'avance

    Rom1nux
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    gcc a un flag -fvisibility=hidden pour ne pas exporter les données globales par défaut.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Salut Matafan,
    Un grand merci pour ton aide, effectivement ca fonctionne comme attendu avec ce flag sur l'executable. Par contre comment ça se fait que changement est si brutale sur gcc ?
    (gcc4.3.2 et gcc4.5.1 ont le même comportement sans le flag....)

    Derniere chose, du coup je me retrouve un peu enuyer dans mon Makefile,
    je voudrais mettre ce CFLAGS specifique pour l'exe et rien pour la lib.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    CC=gcc -fPIC -Wall -g 
    LIBLDFLAGS=-shared
    LIBCFLAGS=
    LIBEXEC=libdltest.so
    LIBSRCD=.
         
    CTRLLDFLAGS=-ldl
    CTRLCFLAGS=-fvisibility=hidden
    CTRLEXEC=exedltest
    CTRLSRCD=.
    
    all: 	$(LIBEXEC) $(CTRLEXEC) 
    
    $(CTRLEXEC): 	$(CTRLSRCD)/exedltest.o
    		$(CC) -o $@ $^ $(CTRLLDFLAGS)
    
    $(LIBEXEC): 	$(LIBSRCD)/libdltest.o
    		$(CC) -o $@ $^ $(LIBLDFLAGS)
    
    %.o: %.c
    	$(CC) -o $@ -c $< $(LIBCFLAGS)  ????????
    
    clean:
    
    	rm -f $(LIBSRCD)/*.o
    
    	rm -f $(CTRLSRCD)/*.o
    
    
    
    mrproper: clean
    
    	rm -f $(LIBEXEC)	
    
    	rm -f $(CTRLEXEC)
    Est ce que vous pouvez m'aider a corriger ce Makefile pour qu'il puisse compiler l'exe et la lib en même temps mais avec des xxxCFLAGS differents lors du "%.o: %.c".
    Je ne sais pas comment m'y prendre a moins de réecrire ensemble des .o manuellement.

    Encore merci pour votre aide

    Rom1nux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo