Hi Zhangjin,
I haven't reviewed the rest yet but regarding this point:
On Thu, Jul 13, 2023 at 02:12:27PM +0800, Zhangjin Wu wrote:
- /* find auxv */
- i = 0;
- while (envp[i])
i++;
- _auxv = (void *)(envp + i + 1);
Could be simplified a bit:
_auxv = (void *) envp; while (_auxv) _auxv++;
Yeah, it is better, but needs a little change.
_auxv = (void *) envp; while (*_auxv)
_auxv++; _auxv++;
Or just:
_auxv = (void*)environ; while (*_auxv++) ;
or:
for (_auxv = (void*)environ; *_auxv++; ) ;
Please also have a look at the output code, because at low optimization levels, compilers sometimes produce a better code with a local variable than with a global variable in a loop. Thus I wouldn't be that much surprised if at -O0 or -O1 you'd see slightly more compact code using:
/* find envp */ environ = argv + argc + 1;
/* find auxv */ for (auxv = environ; *auxv++) ; _auxv = auxv;
than: /* find envp */ envp = argv + argc + 1; environ = envp;
/* find auxv */ for (_auxv = environ; *_auxv++) ;
Since it's going to become generic code, it's worth running a few tests to see how to best polish it.
Thanks, Willy