2014-09-05 2 views
1

Considérons un programme comme:Obliger ld pour résoudre des références faibles au moment ld

#include <stdio.h> 
void foo() __attribute__((__weak__)); 
int main() 
{ 
    printf("%p\n", (void *)foo); 
    if (foo) foo(); 
} 

Si compilé en tant que régulier, non-PIE exécutable dynamique lié à la non-existence de foo est résolu à ld temps, et même si LD_PRELOAD est utilisé pour définir foo, il ne sera pas vu. D'un autre côté, si le programme est compilé en tant que PIE, les références de symboles dynamiques faibles se retrouvent dans la sortie, et LD_PRELOAD peut rendre le symbole foo visible.

Existe-t-il un moyen de forcer le comportement non-PIE (résoudre la non-existence du symbole faible référencé à l'heure ld, plutôt qu'à l'exécution) pour les exécutables PIE?

Répondre

0

Une fonction avec cet attribut a son nom émis comme un symbole faible au lieu d'un nom global. Ceci est principalement pour nommer les routines de la bibliothèque qui peuvent être remplacées par le code utilisateur .

symbole faible Le fait d'avoir deux symboles globaux ou plus portant le même nom ne provoque pas de conflit tant que tous sauf un d'entre eux sont déclarés comme étant des symboles faibles. L'éditeur de liens ignore les définitions des symboles faibles et utilise la définition de symbole global normal pour résoudre toutes les références, mais les symboles faibles seront utilisés si le symbole global normal n'est pas disponible. Un symbole faible peut être utilisé pour nommer les fonctions et les données qui peuvent être remplacées par le code utilisateur. Un symbole faible est également appelé alias faible ou simplement faible.

Depuis internet!