[RFC PATCH u-boot 02/12] sandbox: errno: avoid conflict with libc's errno

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Mar 5 18:21:51 CET 2021


On 05.03.21 16:37, Marek Behun wrote:
> On Fri, 5 Mar 2021 11:00:45 +0800
> Bin Meng <bmeng.cn at gmail.com> wrote:
>
>> On Wed, Mar 3, 2021 at 12:13 PM Marek Behún <marek.behun at nic.cz> wrote:
>>>
>>> When building with LTO, the system libc's `errno` variable used in
>>> arch/sandbox/cpu/os.c conflicts with U-Boot's `errno` (defined in
>>> lib/errno.c) with the following error:
>>>  .../ld: errno@@GLIBC_PRIVATE: TLS definition in /lib64/libc.so.6
>>>          section .tbss mismatches non-TLS reference in
>>>          /tmp/u-boot.EQlEXz.ltrans0.ltrans.o
>>
>> Do you know if this is the expected behavior when enabling LTO on the compiler?
>
> I don't, but this is a bug anyway. The symbol clashes with the symbol
> from glibc. Does somebody know whether the usage of this symbol in os.c
> does really use glibc's version or U-Boot's one?
>

Hello Marek,

Why do you resort to assembler in your patch instead of simply using:

    #define errno __uboot_errno

to substitute the symbol?

Why explicitly set errno = 0? Globals are automatically initialized to zero.

@Bin:
Here is an example demonstrating that glibc's errno is used in os.c:

=> host ls hostfs
errno = 9
readdir: Bad file descriptor
double free or corruption (top)
Aborted

caused by the change below:

diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index 3d8af0a52b..5b45296c47 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -456,9 +456,12 @@ int os_dirent_ls(const char *dirname, struct
os_dirent_node **headp)

        for (node = head = NULL;; node = next) {
                errno = 0;
+               closedir(dir);
                entry = readdir(dir);
                if (!entry) {
                        ret = errno;
+                       printf("errno = %d\n", errno);
+                       perror("readdir");
                        break;
                }
                next = malloc(sizeof(*node) + strlen(entry->d_name) + 1);

Best regards

Heinrich


More information about the U-Boot mailing list