Comment la fonction main () dans un object partagé (.so) est-elle prise en charge par l’éditeur de liens?

Supposons que j’ai

Comment l’éditeur de liens prendra-t-il soin du point d’entrée lorsque les deux sont liés dynamicment pour créer le source.bin binary source.bin ?

Chaque fois que vous avez un programme lié dynamic, plusieurs “points d’entrée” sont impliqués. Le premier est le point d’entrée du lieur dynamic lui-même, par exemple /lib/ld-linux.so.2 (sous Linux / x86) ou similaire. L’éditeur de liens dynamic s’exécute en premier; il résout tous les noms de symboles en leurs définitions (que ces définitions se trouvent dans le programme principal ou dans une bibliothèque), puis passe l’exécution au deuxième point d’entrée du fichier binary du programme principal. Ce n’est pas main mais une partie du “runtime C” (donc crt.o et noms similaires) qui prend en charge certains éléments main (comme les ctors C ++, la configuration du pointeur sur les variables d’environnement et la construction des bons arguments pour main ). Ce code se termine par (l’équivalent de) exit(main(argc, argv)); qui utilisera les adresses déplacées (par l’éditeur de liens dynamic) des exit et des main .

main() est comme n’importe quelle autre fonction, mais dans l’environnement hébergé, il est traité comme le point d’entrée logique d’un programme c / c ++. Il n’ya donc rien de spécial en ce qui concerne la liaison de main() tant que fonction.