mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
1caa1154c3
Till now errno was declared static so that it could be eliminated if unused. While the goal is commendable for tiny executables as it allows to eliminate any data and bss segments when not used, this comes with some limitations, one of which being that the errno symbol seen in different units are not the same. Even though this has never been a real issue given the nature of the programs involved till now, it happens that referencing the same symbol from multiple units can also be achieved using weak symbols, with a difference being that only one of them will be used for all of them. Compared to weak symbols, static basically have no benefit for regular programs since there are always at least a few variables in most of these, so the bss segment cannot be eliminated. E.g: $ size nolibc-test-static-errno text data bss dec hex filename 11531 0 48 11579 2d3b nolibc-test-static-errno Furthermore, the weak symbol doesn't use bss storage at all, resulting in a slightly section: $ size nolibc-test-weak-errno text data bss dec hex filename 11531 0 40 11571 2d33 nolibc-test-weak-errno This patch thus converts errno from static to weak. Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
29 lines
655 B
C
29 lines
655 B
C
/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
|
|
/*
|
|
* Minimal errno definitions for NOLIBC
|
|
* Copyright (C) 2017-2022 Willy Tarreau <w@1wt.eu>
|
|
*/
|
|
|
|
#ifndef _NOLIBC_ERRNO_H
|
|
#define _NOLIBC_ERRNO_H
|
|
|
|
#include <asm/errno.h>
|
|
|
|
#ifndef NOLIBC_IGNORE_ERRNO
|
|
#define SET_ERRNO(v) do { errno = (v); } while (0)
|
|
int errno __attribute__((weak));
|
|
#else
|
|
#define SET_ERRNO(v) do { } while (0)
|
|
#endif
|
|
|
|
|
|
/* errno codes all ensure that they will not conflict with a valid pointer
|
|
* because they all correspond to the highest addressable memory page.
|
|
*/
|
|
#define MAX_ERRNO 4095
|
|
|
|
/* make sure to include all global symbols */
|
|
#include "nolibc.h"
|
|
|
|
#endif /* _NOLIBC_ERRNO_H */
|