////////////////////////////////// exercice : piste noire /////////////////////////////////// en assembleur cela fonctionne __asm__ volatile("syscall" :: "a" (60), "D" (42) ); Avec readelf on voit qu'on utilise pas de bibliotheque et il n'utilise que 6 sections pcwik@gambrinus14:~/Desktop/pierrotc/liens$ ldd minimal not a dynamic executable //////////////////////////////////// exercice "épilogue" ////////////////////////////// l'executable n'a plus que 2 sections Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 00000000004000b0 000000b0 0000000000000014 0000000000000000 AX 0 0 1 [ 2] .shstrtab STRTAB 0000000000000000 000000c4 0000000000000011 0000000000000000 0 0 1 EDITION DES LIENS 2/5 /////////////////////////////////// Exercice "segment pour constante" /////////////////////////////////////:: void _start(void) { char *chaine = "salut"; int i=0; while(chaine[i] != '\0') { i++; } __asm__ volatile("syscall" :: "a" (60), "D" (i) ); } AVEC LE PROGRAMME CI DESSUS j'OBTIENT LES SECTIONS CI DESSOUS : Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 00000000004000b0 000000b0 000000000000003b 0000000000000000 AX 0 0 1 [ 2] .rodata PROGBITS 00000000004000eb 000000eb 0000000000000006 0000000000000000 A 0 0 1 [ 3] .shstrtab STRTAB 0000000000000000 000000f1 0000000000000019 0000000000000000 0 0 1 //////////////////////////////////////////////////Exercice "segment pour variable globale initialisée" //////////////////////////////// int j = 42; void _start(void) { __asm__ volatile("syscall" :: "a" (60), "D" (j) ); } Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 00000000004000b0 000000b0 0000000000000014 0000000000000000 AX 0 0 1 [ 2] .shstrtab STRTAB 0000000000000000 000000c4 0000000000000011 0000000000000000 0 0 1 ///////////////////////////////////////////////////:: STATIQUE ///////////////////////////////////////////////////:: void _start(void) { static int i; __asm__ volatile("syscall" :: "a" (60), "D" (i) ); } Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 00000000004000e8 000000e8 0000000000000015 0000000000000000 AX 0 0 1 [ 2] .bss NOBITS 0000000000600100 00000100 0000000000000008 0000000000000000 WA 0 0 4 [ 3] .shstrtab STRTAB 0000000000000000 000000fd 0000000000000016 0000000000000000 0 0 1 ////////////////////////////////////////////////////////// "zone mémoire allouée pour la pile" ////////////////////// On voit que le prog n'alloue aucune place dans la pile lorsqu'il n'est pas executé : GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 10 Mais lorsqu'il est executé il alloue de la memoire dans la pile : 00400000-00401000 r-xp 00000000 00:23 47981511 /home/apima3/pcwik/Desktop/pierrotc/opti/liens/pile 7ffcc0f0d000-7ffcc0f2e000 rw-p 00000000 00:00 0 [stack] <------- ICI ADRESSE DE DEBUT ET ADRESSE DE FIN DIFFERENTES 7ffcc0fd5000-7ffcc0fd7000 r-xp 00000000 00:00 0 [vdso] 7ffcc0fd7000-7ffcc0fd9000 r--p 00000000 00:00 0 [vvar] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] //////////////////////////////////////////// "zone mémoire allouée pour le tas" /////////////////////////////////////////////// ici on voit qu'un emplacement est alloué pour le tas 00400000-00401000 r-xp 00000000 00:23 47978600 /home/apima3/pcwik/Desktop/pierrotc/opti/liens/tas 00600000-00601000 rw-p 00000000 00:23 47978600 /home/apima3/pcwik/Desktop/pierrotc/opti/liens/tas 00838000-00859000 rw-p 00000000 00:00 0 [heap] 7f97cf85c000-7f97cf9fe000 r-xp 00000000 08:01 1314756 /lib/x86_64-linux-gnu/libc-2.19.so 7f97cf9fe000-7f97cfbfd000 ---p 001a2000 08:01 1314756 /lib/x86_64-linux-gnu/libc-2.19.so 7f97cfbfd000-7f97cfc01000 r--p 001a1000 08:01 1314756 /lib/x86_64-linux-gnu/libc-2.19.so 7f97cfc01000-7f97cfc03000 rw-p 001a5000 08:01 1314756 /lib/x86_64-linux-gnu/libc-2.19.so 7f97cfc03000-7f97cfc07000 rw-p 00000000 00:00 0 7f97cfc07000-7f97cfc27000 r-xp 00000000 08:01 1311215 /lib/x86_64-linux-gnu/ld-2.19.so 7f97cfdf5000-7f97cfdf8000 rw-p 00000000 00:00 0 7f97cfe24000-7f97cfe27000 rw-p 00000000 00:00 0 7f97cfe27000-7f97cfe28000 r--p 00020000 08:01 1311215 /lib/x86_64-linux-gnu/ld-2.19.so 7f97cfe28000-7f97cfe29000 rw-p 00021000 08:01 1311215 /lib/x86_64-linux-gnu/ld-2.19.so 7f97cfe29000-7f97cfe2a000 rw-p 00000000 00:00 0 7ffe7f9ef000-7ffe7fa10000 rw-p 00000000 00:00 0 [stack] 7ffe7fb9f000-7ffe7fba1000 r-xp 00000000 00:00 0 [vdso] 7ffe7fba1000-7ffe7fba3000 r--p 00000000 00:00 0 [vvar] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] ///////////////////////////////////////////////////// exercice programme sans main ////////////////////////////////////////////////////// /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o : Dans la fonction « _start » : /build/glibc-h_iKOs/glibc-2.19/csu/../sysdeps/x86_64/start.S:118 : référence indéfinie vers « main » collect2: error: ld returned 1 exit status ////////////////////////////// compilation separee //////////////////////////// a été effectuée le sens n'importe pas