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

Objective-C Discussion :

Forcer des symboles à être visible [Snow Leopard]


Sujet :

Objective-C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par défaut Forcer des symboles à être visible
    Bonjour,

    Dans le but de "sécuriser" une dylib, je cherche à masquer les symboles non utilisés à l'extérieur. Pour cela, je me suis aidé de cet article.

    J'ai donc ajouté le flag -fvisibility=hidden et -s à la ligne de commande. J'ai forcé certaines à être exportée en C++ en utilisant "extern "C"". Ceci fonctionne bien, après compilation, je peux bien voir la liste des symboles en utilisant l'outil "nm".

    Cependant, j'ai un problème avec certaines méthodes en Objective-C, qui sont supprimées de la table des symboles, mais ne devraient pas.

    Pour forcer à garder les symboles, j'ai essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define EXPORT __attribute__((visibility("default")))
    EXPORT
    @interface PrepareMechanism : AuthMechanism {
    }
    - (OSStatus)invoke;
    @end
    Mais le symbole est enlevé. Lorsque j'analyse la table des symboles avec l'outil nm, la méthode "PrepareMechanism" a été enlevée.

    J'ai également essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #pragma GCC visibility push(default)
    @interface PrepareMechanism : AuthMechanism {
    }
    - (OSStatus)invoke;
    @end
    #pragma GCC visibility pop
    Mais le symbole est également supprimé.

    Comment donc faire pour forcer cette méthode à rester visible en compilant avec le flag -fvisibility=hidden?

    Merci d'avance pour votre aide.

    Salutations

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par pasqual Voir le message
    Mais le symbole est enlevé. Lorsque j'analyse la table des symboles avec l'outil nm, la méthode "PrepareMechanism" a été enlevée.
    il n'y a pas de méthode "PrepareMechanism" dans votre code : "PrepareMechanism" est le nom d'une interface.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par défaut
    il n'y a pas de méthode "PrepareMechanism" dans votre code : "PrepareMechanism" est le nom d'une interface.
    Oui je voulais dire la méthode "invoke", j'ai écris un peu vite.

    Si je compile sans le flag fvisibility=hidden, et que je fais un nm sur ma dylib pour voir la table des symboles, je peux voir le symbol

    0000000000019160 t -[PrepareMechanism invoke]

    Si je met le flag fvisibility=hidden et -s, le symbole disparait, alors même que j'ai explicitement employé __attribute__((visibility("default"))) (même chose avec les pragmas)

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    RTFM:

    "In a 32-bit Mac OS X project, these visibility controls apply only to the C or C++ subset of your code. They do not apply to Objective-C classes and methods. Objective-C class and message names are bound by the Objective-C runtime, not by the linker, so the notion of visibility does not apply to them. There is no mechanism for hiding an Objective-C class or method defined in a dynamic library from the clients of that library.

    When building for x86_64 Mac OS X or for iOS, symbol visibility does affect objective-C classes. Hiding a class is not a security panacea—enterprising developers can access any class with objective-C runtime calls—but if you directly reference a class whose visibility is hidden in a library you link to, you will get a linker error. This means that if a given class is intended to be usable outside the library or executable it's defined in, you need to ensure proper symbol visibility."

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Par défaut
    When building for x86_64 Mac OS X or for iOS, symbol visibility does affect objective-C classes.
    Je compile en x86_64, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __attribute__((visibility("default")))
    devrait être pris en compte, non?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par pasqual Voir le message
    Je compile en x86_64, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __attribute__((visibility("default")))
    devrait être pris en compte, non?
    J'ai testé ici sur un vieux framework et çà fonctionne parfaitement comme documenté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nm -g PATH_TO_DYLIB
    avec -fvisibility=hidden et __attribute__((visibility("default"))) devant l'@interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    00000000350030d8 S _OBJC_CLASS_$_Dbm
                     U _OBJC_CLASS_$_NSData
                     U _OBJC_CLASS_$_NSObject
                     U _OBJC_CLASS_$_NSString
    0000000035003630 S _OBJC_IVAR_$_Dbm._currentKey
    0000000035003620 S _OBJC_IVAR_$_Dbm._db
    0000000035003628 S _OBJC_IVAR_$_Dbm._pathname
    00000000350030b0 S _OBJC_METACLASS_$_Dbm
                     U _OBJC_METACLASS_$_NSObject
                     U __objc_empty_cache
                     U __objc_empty_vtable
                     U _atexit
    …
    avec -fvisibility=hidden et SANS __attribute__((visibility("default")))
    devant l'@interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                     U _OBJC_CLASS_$_NSData
                     U _OBJC_CLASS_$_NSObject
                     U _OBJC_CLASS_$_NSString
                     U _OBJC_METACLASS_$_NSObject
                     U __objc_empty_cache
                     U __objc_empty_vtable
                     U _atexit
    …

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

Discussions similaires

  1. Programme : Table des symboles
    Par Premium dans le forum C
    Réponses: 13
    Dernier message: 02/11/2017, 19h15
  2. TrayIcon => forcer une JFrame à être visible
    Par tomy4ever dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 13/11/2006, 18h25
  3. Quel langage pour manipuler des entiers très longs ?
    Par mis_dj dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 10/05/2006, 21h12
  4. Recherche des symboles dans une lib c++
    Par firens dans le forum MFC
    Réponses: 4
    Dernier message: 31/03/2006, 14h56
  5. [Sybase] Définition des symboles
    Par SoaB dans le forum Sybase
    Réponses: 5
    Dernier message: 19/03/2003, 23h06

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