libprocstat(3): retrieve process command line args and environment

Mikolaj Golub to.my.trociny at gmail.com
Fri Mar 29 12:32:08 UTC 2013


On Fri, Mar 29, 2013 at 11:22:45AM +0200, Konstantin Belousov wrote:
> On Thu, Mar 28, 2013 at 11:18:21PM +0200, Mikolaj Golub wrote:
> > On Thu, Mar 28, 2013 at 12:51:34PM +0200, Konstantin Belousov wrote:
> > 
> > > In the generic Elf 64bit draft specification I have, the notes sections
> > > are specified to consists of entries, each of which is an array of 8-byte
> > > words. I think we are right using the 8-byte alignment.
> > 
> > I have impression many implementations use 4-byte alignment. E.g. in
> > NetBSD:
> > 
> > sys/kern/core_elf32.c:
> > 
> > #define ELFROUNDSIZE    4       /* XXX Should it be sizeof(Elf_Word)? */
> > #define elfround(x)     roundup((x), ELFROUNDSIZE)
> Note that this is core_elf32. I am concerned with the 64-bit cores.

core_elf64.c:

#define	ELFSIZE	64

#include "core_elf32.c"

> > 
> > Also, we have inconsistency with imgactl_elf.c/parse_notes(), which
> > uses 4-byte alignment:
> > 
> > 		note = (const Elf_Note *)((const char *)(note + 1) +
> > 		    roundup2(note->n_namesz, sizeof(Elf32_Addr)) +
> > 		    roundup2(note->n_descsz, sizeof(Elf32_Addr)));
> > 
> > I suppose there were no issues before, because accidentally the sizes
> > of all notes we had were 8 bytes aligned.
> Indeed, both ABI and NOINIT notes have size which is multiple of 8.
> 
> > 
> > Now, when I add new notes it will break things. I don't have strong
> > opinion, it will be ok for me to leave 8-byte alignment and fix
> > issues, just want to have strong support here :-)
> Well, while the issue is discussed and decided, you could just make
> your new notes size be multiple of 8 too.

I thought about this too. Then I need to be more caerful when
extracting stats from notes, because the length returned by
procstat_core_get() can be more than a real payload.

Ok, I will try this way.

I could add length to the note header, which is currently contains
only structsize, so it would became something like:

struct {
  int structsize;
  int lenght;
}

But not sure it is worth doing, especially if the forced 8-bit
alignment is a temporary mesure.

> > 
> > BTW, looking at NetBSD code I see they set p_align in the note
> > segement to ELFROUNDSIZE:
> > 
> >         /* Write out the PT_NOTE header. */
> >         ws.psections->p_type = PT_NOTE;
> >         ws.psections->p_offset = notestart;
> >         ws.psections->p_vaddr = 0;
> >         ws.psections->p_paddr = 0;
> >         ws.psections->p_filesz = notesize;
> >         ws.psections->p_memsz = 0;
> >         ws.psections->p_flags = PF_R;
> >         ws.psections->p_align = ELFROUNDSIZE;
> > 
> > while we set to 0:
> > 
> > 	/* The note segement. */
> > 	phdr->p_type = PT_NOTE;
> > 	phdr->p_offset = hdrsize;
> > 	phdr->p_vaddr = 0;
> > 	phdr->p_paddr = 0;
> > 	phdr->p_filesz = notesz;
> > 	phdr->p_memsz = 0;
> > 	phdr->p_flags = 0;
> > 	phdr->p_align = 0;
> You mean, for the core dumps ?

yes

> > 
> > Shouldn't we set it to alignment size too? Note also, they set
> > "Segment is readable" flag.
> I think both changes are fine.
> 
> I skimmed over the usermode parts of the patch. One thing I did not liked
> is the mis-handling of the read() return values. If there is short read,
> the errno value is meaningless, but warn() would still append it to
> the message. I suggest to explicitely distinguish -1 and >= 0 returns
> from reads.

ok. Thanks.

-- 
Mikolaj Golub


More information about the freebsd-hackers mailing list