• [^] # Re: Dynamique vs statique

    Posté par . En réponse au message probleme pour comprendre l'édition de lien. Évalué à 4.

    L'utilitaire "strace" est également bien utile pour voir le cheminement des appels lors du chargement des librairies dynamiques.

    strace ./bonjour_dyn 
    execve("./bonjour_dyn", ["./bonjour_dyn"], 0x7ffe7a1756c0 /* 60 vars */) = 0
    brk(NULL) = 0x1715000
    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=124549, ...}) = 0
    mmap(NULL, 124549, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe9a3906000
    close(3) = 0
    openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    read(3, "177円ELF2円1円1円3円0円0円0円0円0円0円0円0円3円0円>0円1円0円0円0円0円21円2円0円0円0円0円0円"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=2066504, ...}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a3904000
    mmap(NULL, 3889792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe9a334b000
    mprotect(0x7fe9a34f8000, 2093056, PROT_NONE) = 0
    mmap(0x7fe9a36f7000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ac000) = 0x7fe9a36f7000
    mmap(0x7fe9a36fd000, 14976, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe9a36fd000
    close(3) = 0
    arch_prctl(ARCH_SET_FS, 0x7fe9a39054c0) = 0
    mprotect(0x7fe9a36f7000, 16384, PROT_READ) = 0
    mprotect(0x600000, 4096, PROT_READ) = 0
    mprotect(0x7fe9a3925000, 4096, PROT_READ) = 0
    munmap(0x7fe9a3906000, 124549) = 0
    fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0
    brk(NULL) = 0x1715000
    brk(0x1736000) = 0x1736000
    brk(NULL) = 0x1736000
    write(1, "bonjour", 7bonjour) = 7
    exit_group(0) = ?
    +++ exited with 0 +++
    

    On peut voir dans ce log, un premier accès au fichier "/etc/ld.so.cache", qui permet au système de retrouver la librairie libc, qu'il va ensuite ouvrir

    openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC)

    Le système va ensuite faire un mmap de la fonction fprintf, qui appelle elle même d'autres fonctions (qui sont également mmapée), jusqu'à l'appel final qu'on peut voir vers la fin du log:

    write(1, "bonjour", 7bonjour)