--- /dev/null
+
+-----------------------------------------------------------------------------
+Info about the relationship between Segments and SegInfos
+-----------------------------------------------------------------------------
+
+SegInfo is from the very original Valgrind code, and so it predates
+Segments. It's poorly named now; its really just a container for all
+the object file metadata (symbols, debug info, etc).
+
+Segments describe memory mapped into the address space, and so any
+address-space chaging operation needs to update the Segment structure.
+After the process is initalized, this means one of:
+
+ * mmap
+ * munmap
+ * mprotect
+ * brk
+ * stack growth
+
+A piece of address space may or may not be mmaped from a file.
+
+A SegInfo specifically describes memory mmaped from an ELF object file.
+Because a single ELF file may be mmaped with multiple Segments, multiple
+Segments can point to one Seginfo. A SegInfo can relate to a memory
+range which is not yet mmaped. For example, if the process mmaps the
+first page of an ELF file (the one containing the header), a SegInfo
+will be created for that ELF file's mappings, which will include memory
+which will be later mmaped by the client's ELF loader. If a new mmap
+appears in the address range of an existing SegInfo, it will have that
+SegInfo attached to it, presumably because its part of a .so file.
+Similarly, if a Segment gets split (by mprotect, for example), the two
+pieces will still be associated with the same SegInfo. For this reason,
+the address/length info in a SegInfo is not a duplicate of the Segment
+address/length.
+
+This is complex for several reasons:
+
+ 1. We assume that if a process is mmaping a file which contains an
+ ELF header, it intends to use it as an ELF object. If a program
+ which just mmaps ELF files but just uses it as raw data (copy, for
+ example), we still treat it as a shared-library opening.
+ 2. Even if it is being loaded as a shared library/other ELF object,
+ Valgrind doesn't control the mmaps. It just observes the mmaps
+ being generated by the client and has to cope. One of the reasons
+ that Valgrind has to make its own mmap of each .so for reading
+ symtab information is because the client won't necessary mmap the
+ right pieces, or do so in the wrong order for us.
+
+SegInfos are reference counted, and freed when no Segments point to them any
+more.
+
+> Aha. So the range of a SegInfo will always be equal to or greater
+> than the range of its parent Segment? Or can you eg. mmap a whole
+> file plus some extra pages, and then the SegInfo won't cover the extra
+> part of the range?
+
+That would be unusual, but possible. You could imagine ld generating an
+ELF file via a mapping this way (which would probably upset Valgrind no
+end).