Cela dépend si votre implémentation utilise C interface pour les utilitaires de bas niveau ou non.
Si votre implémentation de langage donne un accès direct aux appels système sans passer par le C wrapper vous n'avez pas besoin d'utiliser VDSO (vous pouvez par exemple générer le SYSENTER
approprié instruction machine pour effectuer l'appel système), mais vous pouvez décider d'utiliser VDSO et en profiter ensuite. Dans ce cas, votre langage n'a même pas besoin de suivre toutes les conventions ABI, juste les conventions du noyau. (par exemple, vous n'avez pas besoin de la distinction calle-safe fournie par ABI sur les registres, et vous pouvez même éviter d'utiliser des piles).
Un exemple d'implémentation de langage n'utilisant même pas libc.so
est Bones Scheme. Vous pourriez en trouver quelques autres.
Ma compréhension du VDSO est qu'il s'agit d'une abstraction, fournie par le noyau, pour faire abstraction des diverses petites différences (liées aux transitions user-land -> kernel) dans l'implémentation des appels système, entre les différentes familles de processeurs x86. Si vous avez choisi une cible de processeur particulière, vous n'avez pas besoin de VDSO et vous pouvez toujours l'éviter.
AFAIU, le VDSO est un objet partagé ELF, assis (sur ma Debian/AMD64 avec un noyau 3.8.3 récemment compilé) dans le segment ffffffffff600000-ffffffffff601000
; vérifier exactement avec cat /proc/self/maps
où est-ce que c'est). Il vous suffit donc de comprendre l'organisation des objets partagés ELF et d'en récupérer les symboles. Voir ceci et cela liens. Le VDSO utilise les conventions C pour les appels documentées dans la spécification ABI x86-64.
ELF est un format bien documenté. Et il en va de même pour les conventions ABI x86-64 (qui définissent précisément les conventions d'appel C et comment démarre exactement l'image d'un processus. Voir aussi la page de manuel execve(2)), et bien sûr la documentation du noyau, donc je ne comprends pas quel est votre problème. Je suis d'accord que comprendre ELF prend du temps (je l'ai fait il y a 10 ans, mais ma mémoire est rouillée). Lire aussi le <elf.h>
fichier d'en-tête sur votre machine.
Par exemple; en cours d'exécution (sous zsh
sur Debian 64 bits x86-64)
% file $(which sash)
/bin/sash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
statically linked, for GNU/Linux 2.6.26,
BuildID[sha1]=0x0347fcc08fba2f811f58af99f26111d0f579a9f6, stripped
% ldd $(which sash)
not a dynamic executable
% sash
Stand-alone shell (version 3.7)
> ps |grep sash
21635 pts/3 00:00:00 sash
> cat /proc/21635/maps
00400000-004da000 r-xp 00000000 08:01 4985590 /bin/sash
006da000-006dc000 rw-p 000da000 08:01 4985590 /bin/sash
006dc000-006e1000 rw-p 00000000 00:00 0
017e3000-01806000 rw-p 00000000 00:00 0 [heap]
7fe4950e5000-7fe4950e7000 rw-p 00000000 00:00 0
7fff3f130000-7fff3f151000 rw-p 00000000 00:00 0 [stack]
7fff3f173000-7fff3f175000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Voir aussi cette réponse.
Vous voulez probablement dans votre environnement d'exécution une version minimale d'un éditeur de liens dynamique capable d'analyser simplement le VDSO. Vous voulez certainement comprendre l'état exact dans lequel un processus est démarré, et en particulier le rôle de auxv
, le vecteur auxiliaire (j'oublie vraiment ces détails, mais je me souviens qu'ils sont importants). Voir par ex. cet article
En fait, démarrer de manière fiable votre environnement d'exécution est probablement plus difficile que le problème VDSO.
Vous pouvez également lire le guide de l'assembly linux qui explique également certaines choses (mais plus sur x86 que sur x86-64)
BTW, le code de http://musl-libc.org/ (qui est une libc alternative) est beaucoup plus facile à lire et à comprendre (et vous apprendrez facilement comment ils font les liens dynamiques, les pthreads, etc.)
J'ai trouvé ces fichiers utiles dans l'arborescence du noyau Linux :
Documentation/ABI/stable/vdso
(qu'est-ce que l'objet vDSO ?)Documentation/vDSO/parse_vdso.c
(Analyseur de référence pour l'objet vDSO)
L'objet vDSO est un objet partagé dynamique virtuel qui est toujours mappé dans l'espace d'adressage d'un processus amd64 sous linux. Il peut être utilisé pour implémenter des appels système rapides. Pour accéder aux fonctions à l'intérieur de l'objet vDSO, vous devez
- localiser l'objet
- extraire une adresse de la table des symboles
Les deux choses peuvent être faites avec l'implémentation de référence sous licence CC0 parse_vdso.c.