> Date: 2026-08-07 02:11:04+0200 > From: Alejandro Colomar > > > Date: 2026-08-07 02:07:00+0200 > > From: Alejandro Colomar > > > > Hi DJ, > > > > > Date: 2026-08-06 18:15:15-0400 > > > From: DJ Delorie > > > > > > Alejandro Colomar writes: > > > > You forgot to sign. > > > > > > I will never remember that... :-P > > > > > > >> +The resulting data is read when a new process is created by > > > >> +.IR ld.so . > > > > > > > > Sorry for noticing this in v4; I forgot about it. I see this unresolved > > > > issue from earlier versions remains. > > > > > > A program is a file on disk. A process is a running memory image. > > > > Yup. fork(3) creates a process (produces a new PID). execve(2) > > replaces the image of the current process with a program read from disk > > (or in short, executes a program in the current process). > > > > > > > > Neither fork() nor exec() cause the tunables to be loaded, the process > > > itself has to do that. For dynamic ELF programs/processes built with > > > glibc, ld.so does it before it passes control to the ELF image. There > > > are other types of programs/processes that do not use ld.so and thus do > > > not read the tunables cache (which is called "ld.so.cache" for a reason ;-) > > > > Hmmmmm, let's say you call execve(2) several times without any fork(2)s. > > Assuming a that the program paths that you pass to execve(2) are all > > dynamic ELF programs built with glibc, I guess for every time you call > > execve(2), ld.so(8) will be run, and the tunables stored in ld.so.cache > > will be used. Is this correct? > > > > #include > > int > > main(int, char *argv[]) > > { > > sleep(1); > > execve("proc/self/exe", argv, NULL); Dumb of me; missing leading '/'. :) Cheers, Alex > > } > > Oh, I thought this would work as a recursive infinite-loop program. It > doesn't seem to work. I guess there's some race condition? :D > > alx@devuan:~$ cd tmp/ > alx@devuan:~/tmp$ cat ex.c > #include > int > main(int, char *argv[]) > { > sleep(1); > execve("proc/self/exe", argv, NULL); > } > > alx@devuan:~/tmp$ gcc -Wall -Wextra ex.c > alx@devuan:~/tmp$ time ./a.out > > real 0m1.003s > user 0m0.003s > sys 0m0.000s > > > Cheers, > Alex > > > > > Let's also say you fork(2) several times, without any execve(2) calls. > > I suppose that won't trigger any of this, right? > > > > #include > > int > > main(void) > > { > > for (int i = 0; i < 10; i++) { > > sleep(1); > > fork(); > > } > > } > > > > From my understanding, only the first program will trigger this more > > than once, right? > > > > If so, I'd use the same wording that execve(2) uses: > > > > execve() executes the program referred to by path. > > > > That is, execve(2) executes programs, and ld.so.cache is read when > > a program is executed (in the current process). > > > > > > > > I don't know how to say this clearly with fewer words... > > > > > > >> +The syntax allows lines to start with the keyword > > > >> +.I include > > > > > > > > s/I/B/ (since it's a literal, not a variable) > > > > > > Fixed. > > > > > > > > > Cheers, > > Alex > > > > -- > > > > > > -- > --