lkml.org 
[lkml]   [1999]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: dso loading question
On Wed, May 26, 1999 at 09:44:41PM -0700, Kanoj Sarcar wrote:

> I am trying to understand how the glibc ld-linux code works just after
> program startup. I have a small program
>
> main()
> {
> }
>
> on which I ran strace to get the following output:
>
> [kanoj@entity /tmp]$ strace ./a.out
> execve("./a.out", ["./a.out"], [/* 18 vars */]) = 0
> brk(0) = 0x8049558
> open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
> open("/etc/ld.so.cache", O_RDONLY) = 3
> fstat(3, {st_mode=0, st_size=0, ...}) = 0
> mmap(0, 11908, PROT_READ, MAP_PRIVATE, 3, 0) = 0x4000b000
> close(3) = 0
> open("/lib/libc.so.6", O_RDONLY) = 3
> mmap(0, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x4000e000
> munmap(0x4000e000, 4096) = 0
> mmap(0, 670420, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4000e000
> mprotect(0x4009f000, 76500, PROT_NONE) = 0
> mmap(0x4009f000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x90000) = 0x4009f000
> mmap(0x400a6000, 47828, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400a6000
> close(3) = 0
> personality(PER_LINUX) = 0
> getpid() = 9822
> _exit(134513792) = ?
>
> Here are the questions I would like to get answers to:
> 1. What is the purpose of the /etc/ld.so.cache? Where can I learn more
> about it?

Libraries may be spread of a large number of directories. ld.so.cache
is used to shorten this search process.

> 2. I assume the first 4K mmap of libc is to read section headers etc ...
> or is there something more going on there?

Only the ELF header is guaranteed to be at offset 0. All there rest
is accessed via the segment map. My libc looks like:

Program Header:
PHDR off 0x00000034 vaddr 0x00000034 paddr 0x00000034 align 2**2
filesz 0x000000a0 memsz 0x000000a0 flags r-x
INTERP off 0x000d408d vaddr 0x000d408d paddr 0x000d408d align 2**0
filesz 0x00000013 memsz 0x00000013 flags r--
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
filesz 0x000d40a0 memsz 0x000d40a0 flags r-x
LOAD off 0x000d40a0 vaddr 0x000d50a0 paddr 0x000d50a0 align 2**12
filesz 0x00004068 memsz 0x00006f48 flags rw-
DYNAMIC off 0x000d8058 vaddr 0x000d9058 paddr 0x000d9058 align 2**2
filesz 0x000000b0 memsz 0x000000b0 flags rw-

Best enjoy this with an ELF spec on your desk.

> 3. How are the libc mmap/munmap calls made by the loading code? Basically,
> how does the code decide on the offset/length to mmap? Why is an mprotect
> being done?

mprotect calls may be necessary for mapping areas which are mapped without
write access but where relocations need to be applied to.

> 4. Are the .init sections of the dso's executed before the close() of
> the fd referencing the dso?
> 5. At what point is the personality(PER_LINUX) call made?
>
> I am trying to understand how dso loading works in Linux, specially at
> program startup time.

Read glibc/sysdeps/unix/sysv/linux/init-first.c. Actually the entire
startuped & libc initialization code. It's quite complex.

Btw, this all is done in userspace, therefore nothing for linux-kernel or
linux-mm.

Ralf

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:51    [W:0.035 / U:0.932 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site