Runtime vérification de la disponibilité de l'API (faible de liaison) - un comportement incorrect sur 10,5

StackOverflow https://stackoverflow.com/questions/4541156

Question

je construis ma demande sur 10.6, mais le ciblage 10.5 pour le déploiement. Je veux profiter de la gestion des services SMJobBless api lorsque le programme sera exécuté sur 10.6, mais je évidemment aurai besoin encore d'utiliser un outil d'installation privilégié lors de l'exécution sur 10.5.

Je lie faiblement au cadre de gestion des services dans mon objectif exécutable. J'ai essayé plusieurs variantes du code:

if (SMJobBless != NULL) ...

if (SMJobBless) ...

bool const /* or non-const */ useBlessAPI = SMJobBless != NULL;
if (useBlessAPI) ...

Et j'ai même essayé d'utiliser le compilateur drapeaux répertoriés dans une question similaire enjoliverai .

10,6, printf("%p %d", SMJobBless, SMJobBless != NULL) (correctement) affiche une valeur de pointeur non nul pour SMJobBless et 1 pour les non-nulle.

Quand je copie le paquet d'application à 10,5, le printf me dit que SMJobBless est 0x0, mais (à tort) imprime 1 pour un pointeur non nul.

La seule façon que j'ai eu à travailler est par de désactiver toutes les optimisations et attribuer le pointeur de fonction à une variable.

Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;

Mais je ne peux pas désactiver l'optimisation pour le code de production!

Était-ce utile?

La solution 2

Je trouve aussi que, semblable à la question / réponse cité dans les commentaires , si j'affecté le pointeur de fonction à une variable volatile, alors tout évalué ok.

Autres conseils

Essayez de mettre extern Boolean SMJobBless() __attribute__((weak_import)); dans vos fichiers qui utilisent la fonction. Il pourrait ne pas être marqué comme se faible correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top