On 05.03.21 16:37, Marek Behun wrote: > On Fri, 5 Mar 2021 11:00:45 +0800 > Bin Meng <bmeng...@gmail.com> wrote: > >> On Wed, Mar 3, 2021 at 12:13 PM Marek Behún <marek.be...@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