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?