Skip to content

Commit

Permalink
tools/nolibc: completely remove optional environ support
Browse files Browse the repository at this point in the history
In commit 52e423f ("tools/nolibc: export environ as a weak symbol on i386")
and friends the asm startup logic was extended to directly populate the
"environ" array.

This makes it impossible for "environ" to be dropped by the linker.
Therefore also drop the other logic to handle non-present "environ".

Also add a testcase to validate the initialization of environ.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Signed-off-by: Willy Tarreau <w@1wt.eu>
  • Loading branch information
Thomas Weißschuh authored and Willy Tarreau committed Aug 23, 2023
1 parent 4beb9be commit 67d108e
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 13 deletions.
12 changes: 2 additions & 10 deletions tools/include/nolibc/stdlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,10 @@ void free(void *ptr)
* declared as a char **, and must be terminated by a NULL (it is recommended
* to set this variable to the "envp" argument of main()). If the requested
* environment variable exists its value is returned otherwise NULL is
* returned. getenv() is forcefully inlined so that the reference to "environ"
* will be dropped if unused, even at -O0.
* returned.
*/
static __attribute__((unused))
char *_getenv(const char *name, char **environ)
char *getenv(const char *name)
{
int idx, i;

Expand All @@ -102,13 +101,6 @@ char *_getenv(const char *name, char **environ)
return NULL;
}

static __inline__ __attribute__((unused,always_inline))
char *getenv(const char *name)
{
extern char **environ;
return _getenv(name, environ);
}

static __attribute__((unused))
unsigned long getauxval(unsigned long type)
{
Expand Down
7 changes: 4 additions & 3 deletions tools/testing/selftests/nolibc/nolibc-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@
#define SINT_MAX_OF_TYPE(type) (((type)1 << (sizeof(type) * 8 - 2)) - (type)1 + ((type)1 << (sizeof(type) * 8 - 2)))
#define SINT_MIN_OF_TYPE(type) (-SINT_MAX_OF_TYPE(type) - 1)

/* will be used by nolibc by getenv() */
char **environ;
/* will be used to test initialization of environ */
static char **test_envp;

/* will be used by some test cases as readable file, please don't write it */
static const char *argv0;
Expand Down Expand Up @@ -787,6 +787,7 @@ int run_stdlib(int min, int max)
* test numbers.
*/
switch (test + __LINE__ + 1) {
CASE_TEST(environ); EXPECT_PTREQ(1, environ, test_envp); break;
CASE_TEST(getenv_TERM); EXPECT_STRNZ(1, getenv("TERM")); break;
CASE_TEST(getenv_blah); EXPECT_STRZR(1, getenv("blah")); break;
CASE_TEST(setcmp_blah_blah); EXPECT_EQ(1, strcmp("blah", "blah"), 0); break;
Expand Down Expand Up @@ -1120,7 +1121,7 @@ int main(int argc, char **argv, char **envp)
char *test;

argv0 = argv[0];
environ = envp;
test_envp = envp;

/* when called as init, it's possible that no console was opened, for
* example if no /dev file system was provided. We'll check that fd#1
Expand Down

0 comments on commit 67d108e

Please sign in to comment.