lib-$(CONFIG_TAC) += tac.o
lib-$(CONFIG_TAIL) += tail.o
lib-$(CONFIG_TEE) += tee.o
-lib-$(CONFIG_TEST) += test.o
-lib-$(CONFIG_ASH) += test.o # used by ash
-lib-$(CONFIG_HUSH) += test.o # used by hush
-lib-$(CONFIG_MSH) += test.o # used by msh
+lib-$(CONFIG_TEST) += test.o test_ptr_hack.o
+lib-$(CONFIG_ASH) += test.o test_ptr_hack.o # used by ash
+lib-$(CONFIG_HUSH) += test.o test_ptr_hack.o # used by hush
+lib-$(CONFIG_MSH) += test.o test_ptr_hack.o # used by msh
lib-$(CONFIG_TOUCH) += touch.o
lib-$(CONFIG_TR) += tr.o
lib-$(CONFIG_TRUE) += true.o
/* We try to minimize both static and stack usage. */
-struct statics {
+struct test_statics {
char **t_wp;
const struct t_op *t_wp_op;
gid_t *group_array;
jmp_buf leaving;
};
-/* Make it reside in writable memory, yet make compiler understand
- * that it is not going to change. */
-static struct statics *const ptr_to_statics __attribute__ ((section (".data")));
+/* See test_ptr_hack.c */
+extern struct test_statics *const test_ptr_to_statics;
-#define S (*ptr_to_statics)
+#define S (*test_ptr_to_statics)
#define t_wp (S.t_wp )
#define t_wp_op (S.t_wp_op )
#define group_array (S.group_array )
#define leaving (S.leaving )
#define INIT_S() do { \
- (*(struct statics**)&ptr_to_statics) = xzalloc(sizeof(S)); \
+ (*(struct test_statics**)&test_ptr_to_statics) = xzalloc(sizeof(S)); \
barrier(); \
} while (0)
#define DEINIT_S() do { \
- free(ptr_to_statics); \
+ free(test_ptr_to_statics); \
} while (0)
static arith_t primary(enum token n);
lib-y += isdirectory.o
lib-y += kernel_version.o
lib-y += last_char_is.o
-lib-y += lineedit.o
+lib-y += lineedit.o lineedit_ptr_hack.o
lib-y += llist.o
lib-y += login.o
lib-y += make_directory.o
}
-#ifdef __GLIBC__
-/* Make it reside in R/W memory: */
-int *const bb_errno __attribute__ ((section (".data")));
-#endif
-
void lbb_prepare(const char *applet
USE_FEATURE_INDIVIDUAL(, char **argv))
MAIN_EXTERNALLY_VISIBLE;
#endif
/* We try to minimize both static and stack usage. */
-struct statics {
+struct lineedit_statics {
line_input_t *state;
volatile unsigned cmdedit_termw; /* = 80; */ /* actual terminal width */
#endif
};
-/* Make it reside in writable memory, yet make compiler understand
- * that it is not going to change. */
-static struct statics *const ptr_to_statics __attribute__ ((section (".data")));
+/* See lineedit_ptr_hack.c */
+extern struct lineedit_statics *const lineedit_ptr_to_statics;
-#define S (*ptr_to_statics)
+#define S (*lineedit_ptr_to_statics)
#define state (S.state )
#define cmdedit_termw (S.cmdedit_termw )
#define previous_SIGWINCH_handler (S.previous_SIGWINCH_handler)
#define delbuf (S.delbuf )
#define INIT_S() do { \
- (*(struct statics**)&ptr_to_statics) = xzalloc(sizeof(S)); \
+ (*(struct lineedit_statics**)&lineedit_ptr_to_statics) = xzalloc(sizeof(S)); \
barrier(); \
cmdedit_termw = 80; \
USE_FEATURE_EDITING_FANCY_PROMPT(num_ok_lines = 1;) \
if (home_pwd_buf != null_str)
free(home_pwd_buf);
#endif
- free(ptr_to_statics);
+ free(lineedit_ptr_to_statics);
}
#define DEINIT_S() deinit_S()
* Licensed under GPLv2, see file LICENSE in this tarball for details.
*/
+#include <errno.h>
+
struct globals;
#ifndef GCC_COMBINE
* but here we make it live in R/W memory */
struct globals *ptr_to_globals;
+#ifdef __GLIBC__
+int *bb_errno;
+#endif
+
+
#else
+
/* gcc -combine will see through and complain */
/* Using alternative method which is more likely to break
* on weird architectures, compilers, linkers and so on */
struct globals *const ptr_to_globals __attribute__ ((section (".data")));
+#ifdef __GLIBC__
+int *const bb_errno __attribute__ ((section (".data")));
#endif
+#endif