Note: This is a public test instance of Red Hat Bugzilla. The data contained within is a snapshot of the live data so any changes you make will not be reflected in the production Bugzilla. Email is disabled so feel free to test any aspect of the site that you want. File any problems you find or give feedback at bugzilla.redhat.com.

Bug 1863475

Summary: efivar: FTBFS in Fedora rawhide/f33: invalid attempt to declare external version name as default in symbol `efi_set_variable@@LIBEFIVAR_0.24'
Product: [Fedora] Fedora Reporter: Fedora Release Engineering <releng>
Component: efivarAssignee: Petr Pisar <ppisar>
Status: CLOSED ERRATA QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 33CC: fmartine, kdudka, law, pjones, ppisar
Target Milestone: ---   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: efivar-37-14.fc34 efivar-37-14.fc33 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2020-11-03 00:59:06 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1803234    
Attachments:
Description Flags
build.log
none
root.log
none
state.log none

Description Fedora Release Engineering 2020-08-03 16:40:00 UTC
efivar failed to build from source in Fedora rawhide/f33

https://koji.fedoraproject.org/koji/taskinfo?taskID=47943552


For details on the mass rebuild see:

https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Please fix efivar at your earliest convenience and set the bug's status to
ASSIGNED when you start fixing it. If the bug remains in NEW state for 8 weeks,
efivar will be orphaned. Before branching of Fedora 34,
efivar will be retired, if it still fails to build.

For more details on the FTBFS policy, please visit:
https://fedoraproject.org/wiki/Fails_to_build_from_source

Comment 1 Fedora Release Engineering 2020-08-03 16:40:02 UTC
Created attachment 1704033 [details]
build.log

file build.log too big, will only attach last 32768 bytes

Comment 2 Fedora Release Engineering 2020-08-03 16:40:03 UTC
Created attachment 1704034 [details]
root.log

file root.log too big, will only attach last 32768 bytes

Comment 3 Fedora Release Engineering 2020-08-03 16:40:04 UTC
Created attachment 1704035 [details]
state.log

Comment 4 Jeff Law 2020-08-06 15:26:55 UTC
This package was supposed to be opted-out of LTO and did so via the usual mechanisms.  But someone had explicitly added -flto into the passed-in flags.

Until this package switches from ASM based symbol versioning to attribute based symbol versioning it must not use LTO.  I've remove the explicit LTO bits.

THe package still fails its abitest.  So there's still work to do here.

Comment 5 Ben Cotton 2020-08-11 13:58:12 UTC
This bug appears to have been reported against 'rawhide' during the Fedora 33 development cycle.
Changing version to 33.

Comment 6 Fedora Release Engineering 2020-09-30 18:42:05 UTC
Dear Maintainer,

your package has an open Fails To Build From Source bug for Fedora 33.
Action is required from you.

If you can fix your package to build, perform a build in koji, and either create
an update in bodhi, or close this bug without creating an update, if updating is
not appropriate [1]. If you are working on a fix, set the status to ASSIGNED to
acknowledge this. If you have already fixed this issue, please close this Bugzilla report.

Following the policy for such packages [2], your package will be orphaned if
this bug remains in NEW state more than 8 weeks (not sooner than 2020-09-28).

A week before the mass branching of Fedora 34 according to the schedule [3],
any packages not successfully rebuilt at least on Fedora 32 will be
retired regardless of the status of this bug.

[1] https://fedoraproject.org/wiki/Updates_Policy
[2] https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/
[3] https://fedorapeople.org/groups/schedule/f-34/f-34-key-tasks.html

Comment 7 Fedora Release Engineering 2020-10-04 04:23:15 UTC
Dear Maintainer,

your package has an open Fails To Build From Source bug for Fedora 33.
Action is required from you.

If you can fix your package to build, perform a build in koji, and either create
an update in bodhi, or close this bug without creating an update, if updating is
not appropriate [1]. If you are working on a fix, set the status to ASSIGNED to
acknowledge this. If you have already fixed this issue, please close this Bugzilla report.

Following the policy for such packages [2], your package will be orphaned if
this bug remains in NEW state more than 8 weeks (not sooner than 2020-09-28).

A week before the mass branching of Fedora 34 according to the schedule [3],
any packages not successfully rebuilt at least on Fedora 32 will be
retired regardless of the status of this bug.

[1] https://docs.fedoraproject.org/en-US/fesco/Updates_Policy/
[2] https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/
[3] https://fedorapeople.org/groups/schedule/f-34/f-34-key-tasks.html

Comment 8 Fedora Release Engineering 2020-10-25 04:22:55 UTC
Dear Maintainer,

your package has an open Fails To Build From Source bug for Fedora 33.
Action is required from you.

If you can fix your package to build, perform a build in koji, and either create
an update in bodhi, or close this bug without creating an update, if updating is
not appropriate [1]. If you are working on a fix, set the status to ASSIGNED to
acknowledge this. If you have already fixed this issue, please close this Bugzilla report.

Following the policy for such packages [2], your package will be orphaned if
this bug remains in NEW state more than 8 weeks (not sooner than 2020-09-28).

A week before the mass branching of Fedora 34 according to the schedule [3],
any packages not successfully rebuilt at least on Fedora 32 will be
retired regardless of the status of this bug.

[1] https://docs.fedoraproject.org/en-US/fesco/Updates_Policy/
[2] https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/
[3] https://fedorapeople.org/groups/schedule/f-34/f-34-key-tasks.html

Comment 9 Petr Pisar 2020-10-27 07:55:47 UTC
From the attached build log:

gcc -O2 -flto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GL
IBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1  -m6
4 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -flto -std=gnu11 -funsigned-char -fvisibility=hidden
 -specs=/builddir/build/BUILD/efivar-37/src/include/gcc.specs -fno-merge-constants  -L. -Wl,-z,relro -Wl,--as-needed  -Wl,-z,now -specs=/us
r/lib/rpm/redhat/redhat-hardened-ld -flto  -Wl,--add-needed -Wl,--build-id -Wl,--no-allow-shlib-undefined -Wl,--no-undefined-version -Wl,-z
,now -Wl,-z,muldefs -Wl,-z,relro -Wl,--fatal-warnings     -DLIBEFIVAR_VERSION=37 -D_GNU_SOURCE -I/builddir/build/BUILD/efivar-37/src/includ
e/  -shared -Wl,-soname,libefivar.so.1 -Wl,--version-script=libefivar.map  \
  -o libefivar.so crc32.o dp.o dp-acpi.o dp-hw.o dp-media.o dp-message.o efivarfs.o error.o export.o guid.o guids.o guid-symbols.o lib.o va
rs.o -ldl 
{standard input}: Assembler messages:
{standard input}: Error: invalid attempt to declare external version name as default in symbol `efi_set_variable@@LIBEFIVAR_0.24'
lto-wrapper: fatal error: gcc returned 1 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper failed

That was worked around by disabling LTO in efivar-37-13.

Now only abicheck tests fail on some architectures:

+ make abicheck
make -C src abicheck
make[1]: Entering directory '/builddir/build/BUILD/efivar-37/src'
make[2]: Entering directory '/builddir/build/BUILD/efivar-37/src'
make[2]: Nothing to be done for 'deps'.
make[2]: Leaving directory '/builddir/build/BUILD/efivar-37/src'
abidiff \
	--suppr abignore \
	--headers-dir2 /builddir/build/BUILD/efivar-37/src/include/efivar/ \
	libefivar.abixml \
	libefivar.so
Functions changes summary: 0 Removed, 2 Changed (8 filtered out), 0 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
2 functions with some indirect sub-type change:
  [C]'function int _efi_set_variable_variadic(efi_guid_t, const char*, uint8_t*, size_t, uint32_t)' at lib.c:44:1 has some indirect sub-type changes:
    parameter 6 of type '...' was added
  [C]'function int efi_error_set(const char*, const char*, int, int, const char*)' at error.c:86:1 has some indirect sub-type changes:
    parameter 6 of type '...' was added
make[1]: *** [/builddir/build/BUILD/efivar-37/src/include/rules.mk:41: libefivar.abicheck] Error 4
make[1]: Leaving directory '/builddir/build/BUILD/efivar-37/src'

Comment 10 Petr Pisar 2020-10-27 08:00:04 UTC
*** Bug 1881315 has been marked as a duplicate of this bug. ***

Comment 11 Petr Pisar 2020-10-27 08:01:43 UTC
(In reply to Petr Pisar from comment #9)
> Now only abicheck tests fail on some architectures:
> 
Because the test is executed only on x86_64.

Comment 12 Petr Pisar 2020-10-27 08:34:10 UTC
The test compares just-compiled header files against a prebuilt XML ABI representation (obtained from debugging data in an old ELF). Current header file (as well as the library) indeed contains the 6th variadic argument:

extern int efi_error_set(const char *filename,
             const char *function,
             int line,
             int error,
             const char *fmt, ...)
            __attribute__((__visibility__ ("default")))
            __attribute__((__nonnull__ (1, 2, 5)))
            __attribute__((__format__ (printf, 5, 6)));

But the prebuilt ABI representation does not list the argument:

    <function-decl name='efi_error_set' mangled-name='efi_error_set' filepath='/usr/include/string.h' line='100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_error_set@@LIBEFIVAR_1.30'>
      <parameter type-id='type-id-58' name='filename' filepath='/usr/include/string.h' line='100' column='1'/>
      <parameter type-id='type-id-58' name='function' filepath='/usr/include/string.h' line='101' column='1'/>
      <parameter type-id='type-id-4' name='line' filepath='/usr/include/string.h' line='102' column='1'/>
      <parameter type-id='type-id-4' name='error' filepath='/usr/include/string.h' line='103' column='1'/>
      <parameter type-id='type-id-58' name='fmt' filepath='/usr/include/string.h' line='104' column='1'/>
      <return type-id='type-id-4'/>
    </function-decl>

So either some of the numerous patches changed one of these without the other one, or current abidiff tool handles the variadic argument differently.

Comment 13 Petr Pisar 2020-10-27 09:40:04 UTC
A difference between the last passed build (515f6c544746c6f2aaa2ca3d66a5ec14a9ca70fd) and the first failed build (0ed404667277661aac7e90671e6bce470389b809) is only a spec release 
number bump. So the failure is solely triggered by changing the build root.

The original linker error (invalid attempt to declare external version name as default in symbol `efi_set_variable@@LIBEFIVAR_0.24') is triggered by upgrading binutils. It passes with 2.34.0-8.fc33, fails with 2.35-1.fc33.
The new abidiff error (adding a variadic type) is triggered by removing -flto from efivar.spec CFLAGS.

Comment 14 Petr Pisar 2020-10-27 10:19:33 UTC
When I regenerate the prebuilt ABI representation compiled without -flto, abigail notices the variadic 6th argument in the debugging data:

    <function-decl name='efi_error_set' mangled-name='efi_error_set' filepath='src/error.c' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='efi_error_set@@LIBEFIVAR_1.30'>
      <parameter type-id='type-id-166' name='filename' filepath='src/error.c' line='86' column='1'/>
      <parameter type-id='type-id-166' name='function' filepath='src/error.c' line='87' column='1'/>
      <parameter type-id='type-id-7' name='line' filepath='src/error.c' line='88' column='1'/>
      <parameter type-id='type-id-7' name='error' filepath='src/error.c' line='89' column='1'/>
      <parameter type-id='type-id-166' name='fmt' filepath='src/error.c' line='90' column='1'/>
      <parameter is-variadic='yes'/>
      <return type-id='type-id-7'/>
    </function-decl>

Now the question is whether it's was just a bug fixed in the compiler/binutils and it annotates the variadic arguments correctly now, or whether ABI of the function indeed changed. I'm inclined to the first option. Otherwise it would mean that the ABI of the library never matched the API in the header file and hopefully somebody would notice.

Comment 15 Petr Pisar 2020-10-27 11:24:44 UTC
I reported the missing variadic argument to gcc (bug #1891787). I think a workaround for efivar is to patch the pregenerated XML ABI representation.

Comment 16 Fedora Update System 2020-10-27 12:50:20 UTC
FEDORA-2020-6d829f1605 has been submitted as an update to Fedora 33. https://bodhi.fedoraproject.org/updates/FEDORA-2020-6d829f1605

Comment 17 Fedora Update System 2020-10-28 01:03:32 UTC
FEDORA-2020-6d829f1605 has been pushed to the Fedora 33 testing repository.
In short time you'll be able to install the update with the following command:
`sudo dnf upgrade --enablerepo=updates-testing --advisory=FEDORA-2020-6d829f1605`
You can provide feedback for this update here: https://bodhi.fedoraproject.org/updates/FEDORA-2020-6d829f1605

See also https://fedoraproject.org/wiki/QA:Updates_Testing for more information on how to test updates.

Comment 18 Fedora Update System 2020-11-03 00:59:06 UTC
FEDORA-2020-6d829f1605 has been pushed to the Fedora 33 stable repository.
If problem still persists, please make note of it in this bug report.