Quelle est la différence entre les sections .got et .got.plt au format ELF?Quelle est la différence entre la section .got et .got.plt?
Répondre
Mon commentaire précédent a raison, l'exemple ci-dessous rend les choses un peu claires.
Ce sont les délocalisations pour mes 32 bits i686-linux /lib/libm.so
Relocation section '.rel.dyn' at offset 0x32b8 contains 8 entries:
Offset Info Type Sym.Value Sym. Name
00025030 00000008 R_386_RELATIVE
00024fd8 00005706 R_386_GLOB_DAT 00025034 _LIB_VERSION
00024fdc 00000406 R_386_GLOB_DAT 00000000 __gmon_start__
00024fe0 00000506 R_386_GLOB_DAT 00000000 _Jv_RegisterClasses
00024fe4 00000806 R_386_GLOB_DAT 00000000 _rtld_global_ro
00024fe8 00000906 R_386_GLOB_DAT 00000000 stderr
00024fec 00013006 R_386_GLOB_DAT 0002507c signgam
00024ff0 00000e06 R_386_GLOB_DAT 00000000 __cxa_finalize
Relocation section '.rel.plt' at offset 0x32f8 contains 12 entries:
Offset Info Type Sym.Value Sym. Name
00025000 00000107 R_386_JUMP_SLOT 00000000 fputs
00025004 00000207 R_386_JUMP_SLOT 00000000 __errno_location
00025008 00000307 R_386_JUMP_SLOT 00000000 sprintf
0002500c 00000407 R_386_JUMP_SLOT 00000000 __gmon_start__
00025010 00000607 R_386_JUMP_SLOT 00000000 strtod
00025014 00000707 R_386_JUMP_SLOT 00000000 __assert_fail
00025018 00000a07 R_386_JUMP_SLOT 00000000 strlen
0002501c 00000b07 R_386_JUMP_SLOT 00000000 strtof
00025020 00000c07 R_386_JUMP_SLOT 00000000 fwrite
00025024 00000d07 R_386_JUMP_SLOT 00000000 strtold
00025028 00005e07 R_386_JUMP_SLOT 00005970 matherr
0002502c 00000e07 R_386_JUMP_SLOT 00000000 __cxa_finalize
Regardez que vous avez noté il y a deux sections de ce type, à savoir .rel.dyn et .rel.plt. Vous pouvez voir que toutes les relocalisations pour .rel.plt sont de type R_386_JUMP_SLOT ce qui signifie qu'elles sont des relocalisations de branche d'autre part presque toutes les relocations dans .rel.dyn sont R_386_GLOB_DAT ce qui signifie la relocalisation pour les variables globales.
Une autre différence subtile existe entre .symtab et .dynsym. Alors que le premier contient des références pour tous les symboles utilisés lors de l'édition de liens statiques, ceux-ci ne contiennent que les symboles nécessaires pour la liaison dynamique. Ainsi, les relocalisations mentionnées ci-dessus se réfèrent uniquement à la section .dynsym.
- 1. Quelle est la différence entre la section d'autorisation et PrincipalPermissionAttribute?
- 2. Quelle est la différence entre & et @ Sass
- 3. Quelle est la différence entre '==' et '==='?
- 4. Quelle est la différence entre "$^N" et "$ +"?
- 5. Quelle est la différence entre dict() et {}?
- 6. Quelle est la différence entre equales et ==
- 7. Quelle est la différence entre ~ et! opérateur?
- 8. Quelle est la différence entre = et: =
- 9. quelle est la différence entre:.! et: r !?
- 10. Quelle est la différence entre == et ===?
- 11. quelle est la différence entre == et ===?
- 12. quelle est la différence entre * et l'objet
- 13. Quelle est la différence entre `{}` et `[]`?
- 14. quelle est la différence entre '! =' Et
- 15. Quelle est la différence entre la section de configuration de page avec et sans pageBaseType
- 16. Quelle est la différence entre allprojects et sous-projets?
- 17. Quelle est la différence entre la classe() et la classe
- 18. Quelle est la différence entre la structure et la classe
- 19. Quelle est la différence entre la saturation et la luminosité?
- 20. Quelle est la différence entre la sérialisabilité et la linéarisation?
- 21. Quelle est la différence entre la douille et la chaussette?
- 22. Quelle est la différence entre KERN_INVALID_ADDRESS et KERN_PROTECTION_FAILURE?
- 23. Quelle est la différence entre le document et le DOM?
- 24. Quelle est la différence entre fork() et ~ fork()
- 25. Quelle est la différence entre la version et l'itération?
- 26. quelle est la différence entre la compatibilité -source et -target?
- 27. Unix: Quelle est la différence entre la source et l'export?
- 28. Quelle est la différence entre la sérialisation et l'encodage?
- 29. Quelle est la différence entre le rappel et la promesse
- 30. Quelle est la différence entre la représentation list/array [] et {}?
Selon: http://www.acsu.buffalo.edu/~charngda/elf.html Les entrées '.got' ne sont jamais résolues paresseusement, mais les entrées' .got.plt' peuvent être résolues paresseusement. – ninjalj
Je pense que .got est pour les déplacements concernant les 'variables' globales tandis que .got.plt est une section auxiliaire pour agir avec .plt lors de la résolution des adresses absolues des procédures. – JohnTortugo