Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 848745 Details for
Bug 831472
sys-libs/efivar-38 - ld.lld: error: unknown argument '--add-needed'
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
clang.patch
clang.patch (text/plain), 8.63 KB, created by
nvinson234
on 2023-01-17 14:22:41 UTC
(
hide
)
Description:
clang.patch
Filename:
MIME Type:
Creator:
nvinson234
Created:
2023-01-17 14:22:41 UTC
Size:
8.63 KB
patch
obsolete
>From 3778ed47d539a716301ba2e67ba62f796e2df310 Mon Sep 17 00:00:00 2001 >From: Nicholas Vinson <nvinson234@gmail.com> >Date: Mon, 10 Oct 2022 14:22:36 -0400 >Subject: [PATCH] Revamp efi_well_known_* variable handling > >The current implementation attempts to use the linker to create aliases >for efi_well_known_guids and efi_well_known_names. It also tries to use >the linker to generate the variables efi_well_known_guids_end and >efi_well_known_names_end. > >When building with clang, the generated linker result results in a >broken libefivar.so that causes programs to segfault when linked against >it. This change does away with linker script hacker and instead >introduces pointers to store the locations of efi_well_known_guids_end >and efi_well_known_names_end. > >Additionally, efi_well_known_guids and efi_well_known_names are now >created as pointers that point to the beginning of their respective >arrays. > >Signed-off-by: Nicholas Vinson <nvinson234@gmail.com> >Fixes: #234 >--- > src/Makefile | 7 ++-- > src/include/rules.mk | 5 +-- > src/include/workarounds.mk | 24 ------------- > src/makeguids.c | 72 +++++++++++++------------------------- > 4 files changed, 27 insertions(+), 81 deletions(-) > delete mode 100644 src/include/workarounds.mk > >diff --git a/src/Makefile b/src/Makefile >index e04357a7..ec1eabe6 100644 >--- a/src/Makefile >+++ b/src/Makefile >@@ -4,7 +4,6 @@ include $(TOPDIR)/src/include/deprecated.mk > include $(TOPDIR)/src/include/version.mk > include $(TOPDIR)/src/include/rules.mk > include $(TOPDIR)/src/include/defaults.mk >-include $(TOPDIR)/src/include/workarounds.mk > > LIBTARGETS=libefivar.so libefiboot.so libefisec.so > STATICLIBTARGETS=libefivar.a libefiboot.a libefisec.a >@@ -30,7 +29,7 @@ EFISECDB_OBJECTS = $(patsubst %.S,%.o,$(patsubst %.c,%.o,$(EFISECDB_SOURCES))) > GENERATED_SOURCES = include/efivar/efivar-guids.h guid-symbols.c > MAKEGUIDS_SOURCES = makeguids.c util-makeguids.c > MAKEGUIDS_OBJECTS = $(patsubst %.S,%.o,$(patsubst %.c,%.o,$(MAKEGUIDS_SOURCES))) >-MAKEGUIDS_OUTPUT = $(GENERATED_SOURCES) guids.lds >+MAKEGUIDS_OUTPUT = $(GENERATED_SOURCES) > > util-makeguids.c : util.c > cp util.c util-makeguids.c >@@ -84,7 +83,7 @@ $(MAKEGUIDS_OUTPUT) : guids.txt > if [ "$${missing}" != "no" ]; then \ > exit 1 ; \ > fi >- ./makeguids $(LD_DASH_T) guids.txt guid-symbols.c include/efivar/efivar-guids.h guids.lds >+ ./makeguids guids.txt guid-symbols.c include/efivar/efivar-guids.h > > prep : makeguids $(GENERATED_SOURCES) > >@@ -96,7 +95,6 @@ libefivar.a : $(patsubst %.o,%.static.o,$(LIBEFIVAR_OBJECTS)) > libefivar.so : $(LIBEFIVAR_OBJECTS) > libefivar.so : | $(GENERATED_SOURCES) libefivar.map > libefivar.so : LIBS=dl >-libefivar.so : LDSCRIPTS=guids.lds > libefivar.so : MAP=libefivar.map > > efivar : $(EFIVAR_OBJECTS) | libefivar.so >@@ -137,7 +135,6 @@ deps : $(ALL_SOURCES) > clean : > @rm -rfv *~ *.o *.a *.E *.so *.so.* *.pc *.bin .*.d *.map \ > makeguids guid-symbols.c include/efivar/efivar-guids.h \ >- guids.lds \ > $(TARGETS) $(STATICTARGETS) > @# remove the deps files we used to create, as well. > @rm -rfv .*.P .*.h.P *.S.P include/efivar/.*.h.P >diff --git a/src/include/rules.mk b/src/include/rules.mk >index f309f863..8d0b68a2 100644 >--- a/src/include/rules.mk >+++ b/src/include/rules.mk >@@ -3,7 +3,6 @@ default : all > .PHONY: default all clean install test > > include $(TOPDIR)/src/include/version.mk >-include $(TOPDIR)/src/include/workarounds.mk > > comma:= , > empty:= >@@ -36,9 +35,7 @@ family = $(foreach FAMILY_SUFFIX,$(FAMILY_SUFFIXES),$($(1)_$(FAMILY_SUFFIX))) > $(CCLD) $(CCLDFLAGS) $(CPPFLAGS) -o $@ $(sort $^) $(LDLIBS) > > %.so : >- $(CCLD) $(CCLDFLAGS) $(CPPFLAGS) $(SOFLAGS) \ >- $(foreach LDS,$(LDSCRIPTS),$(LD_DASH_T) $(LDS)) \ >- -o $@ $^ $(LDLIBS) >+ $(CCLD) $(CCLDFLAGS) $(CPPFLAGS) $(SOFLAGS) -o $@ $^ $(LDLIBS) > ln -vfs $@ $@.1 > > %.abixml : %.so >diff --git a/src/include/workarounds.mk b/src/include/workarounds.mk >deleted file mode 100644 >index 57394edd..00000000 >--- a/src/include/workarounds.mk >+++ /dev/null >@@ -1,24 +0,0 @@ >-# SPDX-License-Identifier: SPDX-License-Identifier: LGPL-2.1-or-later >-# >-# workarounds.mk - workarounds for weird stuff behavior >- >-LD_FLAVOR := $(shell LC_ALL=C $(LD) --version | grep -E '^(LLD|GNU ld)'|sed 's/ .*//g') >-LD_VERSION := $(shell LC_ALL=C $(LD) --version | grep -E '^(LLD|GNU ld)'|sed 's/.* //') >-# 2.35 is definitely broken and 2.36 seems to work >-LD_DASH_T := $(shell \ >- if [ "x${LD_FLAVOR}" = xLLD ] ; then \ >- echo '-T' ; \ >- elif [ "x${LD_FLAVOR}" = xGNU ] ; then \ >- if echo "${LD_VERSION}" | grep -q -E '^2\.3[6789]|^2\.[456789]|^[3456789]|^[[:digit:]][[:digit:]]' ; then \ >- echo '-T' ; \ >- else \ >- echo "" ; \ >- fi ; \ >- else \ >- echo "Your linker is not supported" ; \ >- exit 1 ; \ >- fi) >- >-export LD_DASH_T >- >-# vim:ft=make >diff --git a/src/makeguids.c b/src/makeguids.c >index 376bffba..bfdee12e 100644 >--- a/src/makeguids.c >+++ b/src/makeguids.c >@@ -107,51 +107,46 @@ write_guidnames(FILE *out, const char *listname, > gn->symbol, gn->name, gn->description); > } > fprintf(out, "};\n"); >+ fprintf(out, "const struct efivar_guidname\n" >+ "\t__attribute__((__visibility__ (\"default\")))\n" >+ "\t* const %s = %s_;\n", listname, listname); >+ fprintf(out, "const struct efivar_guidname\n" >+ "\t__attribute__((__visibility__ (\"default\")))\n" >+ "\t* const %s_end = %s_\n\t+ %zd;\n", >+ listname, listname, n - 1); > } > > int > main(int argc, char *argv[]) > { > int rc; >- int argstart = 0; >- FILE *symout, *header, *ldsout; >- int dash_t = 0; >+ FILE *symout, *header; > >- if (argc < 5) { >+ if (argc < 4) { > errx(1, "Not enough arguments.\n"); >- } else if (argc > 5 && !strcmp(argv[1],"-T")) { >- argstart = 1; >- dash_t = 1; >- } else if (argc > 5) { >+ } else if (argc > 4) { > errx(1, "Too many arguments.\n"); > } > >- symout = fopen(argv[argstart + 2], "w"); >+ symout = fopen(argv[2], "w"); > if (symout == NULL) >- err(1, "could not open \"%s\"", argv[argstart + 2]); >- rc = chmod(argv[argstart + 2], 0644); >+ err(1, "could not open \"%s\"", argv[2]); >+ rc = chmod(argv[2], 0644); > if (rc < 0) >- warn("chmod(%s, 0644)", argv[argstart + 2]); >+ warn("chmod(%s, 0644)", argv[2]); > >- header = fopen(argv[argstart + 3], "w"); >+ header = fopen(argv[3], "w"); > if (header == NULL) >- err(1, "could not open \"%s\"", argv[argstart + 3]); >- rc = chmod(argv[argstart + 3], 0644); >- if (rc < 0) >- warn("chmod(%s, 0644)", argv[argstart + 3]); >- >- ldsout = fopen(argv[argstart + 4], "w"); >- if (ldsout == NULL) >- err(1, "could not open \"%s\"", argv[argstart + 4]); >- rc = chmod(argv[argstart + 4], 0644); >+ err(1, "could not open \"%s\"", argv[3]); >+ rc = chmod(argv[3], 0644); > if (rc < 0) >- warn("chmod(%s, 0644)", argv[argstart + 4]); >+ warn("chmod(%s, 0644)", argv[3]); > > struct guidname_index *guidnames = NULL; > >- rc = read_guids_at(AT_FDCWD, argv[argstart + 1], &guidnames); >+ rc = read_guids_at(AT_FDCWD, argv[1], &guidnames); > if (rc < 0) >- err(1, "could not read \"%s\"", argv[argstart + 1]); >+ err(1, "could not read \"%s\"", argv[1]); > > struct efivar_guidname *outbuf; > >@@ -243,12 +238,11 @@ struct efivar_guidname {\n\ > fprintf(header, > "extern const struct efivar_guidname\n" > "\t__attribute__((__visibility__ (\"default\")))\n" >- "\tefi_well_known_guids[%d];\n", >- i); >+ "\t* const efi_well_known_guids;\n"); > fprintf(header, > "extern const struct efivar_guidname\n" > "\t__attribute__((__visibility__ (\"default\")))\n" >- "\tefi_well_known_guids_end;\n"); >+ "\t* const efi_well_known_guids_end;\n"); > fprintf(header, > "extern const uint64_t\n" > "\t__attribute__((__visibility__ (\"default\")))\n" >@@ -256,12 +250,11 @@ struct efivar_guidname {\n\ > fprintf(header, > "extern const struct efivar_guidname\n" > "\t__attribute__((__visibility__ (\"default\")))\n" >- "\tefi_well_known_names[%d];\n", >- i); >+ "\t* const efi_well_known_names;\n"); > fprintf(header, > "extern const struct efivar_guidname\n" > "\t__attribute__((__visibility__ (\"default\")))\n" >- "\tefi_well_known_names_end;\n"); >+ "\t* const efi_well_known_names_end;\n"); > fprintf(header, > "extern const uint64_t\n" > "\t__attribute__((__visibility__ (\"default\")))\n" >@@ -310,23 +303,6 @@ struct efivar_guidname {\n\ > > fclose(symout); > >- fprintf(ldsout, >- "SECTIONS\n" >- "{\n" >- " .data :\n" >- " {\n" >- " efi_well_known_guids = efi_well_known_guids_;\n" >- " efi_well_known_guids_end = efi_well_known_guids_ + %zd;\n" >- " efi_well_known_names = efi_well_known_names_;\n" >- " efi_well_known_names_end = efi_well_known_names_ + %zd;\n" >- " }\n" >- "}%s;\n", >- (line - 1) * sizeof(struct efivar_guidname), >- (line - 1) * sizeof(struct efivar_guidname), >- dash_t ? " INSERT AFTER .data" : ""); >- >- fclose(ldsout); >- > free(guidnames->strtab); > free(guidnames); >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 831472
:
765197
|
765198
|
848743
| 848745