aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-extended/efivar/efivar/0002-New-gcc-version-new-way-symbol-versioning-breaks.patch
blob: 737b78b019782daeb223dd9beeb70cd788775b5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
From 31e655d2b5f66e772d9714422b7332bbaa60d2e6 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Mon, 6 Feb 2017 14:41:58 -0500
Subject: [PATCH 2/2] New gcc version, new way symbol versioning breaks.

Apparently I get to redo this every time there's a compiler release.
Yaaaaaay.

Anyway, the current method is to define the two compat things from the
land before time as @libefivar.so.0 symbols and list them there in the
link map.  Then we have the real one defined with another name, and set
as efi_set_variable@@LIBEFIVAR_0.24.  Then to make there actually be a
efi_set_variable symbol to link against, we create it as a weak alias.

This is all completely absurd.

Signed-off-by: Peter Jones <pjones@redhat.com>
---
 src/lib.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/lib.c b/src/lib.c
index 6a9b392..afa7d94 100644
--- a/src/lib.c
+++ b/src/lib.c
@@ -49,7 +49,7 @@ _efi_set_variable(efi_guid_t guid, const char *name, uint8_t *data,
 {
 	return ops->set_variable(guid, name, data, data_size, attributes, 0600);
 }
-__asm__(".symver _efi_set_variable,_efi_set_variable@");
+__asm__(".symver _efi_set_variable,_efi_set_variable@libefivar.so.0");
 
 int
 __attribute__((__nonnull__ (2, 3)))
@@ -59,17 +59,24 @@ _efi_set_variable_variadic(efi_guid_t guid, const char *name, uint8_t *data,
 {
 	return ops->set_variable(guid, name, data, data_size, attributes, 0600);
 }
-__asm__(".symver _efi_set_variable_variadic,efi_set_variable@");
+__asm__(".symver _efi_set_variable_variadic,efi_set_variable@libefivar.so.0");
 
 int
 __attribute__((__nonnull__ (2, 3)))
 __attribute__((__visibility__ ("default")))
-efi_set_variable(efi_guid_t guid, const char *name, uint8_t *data,
-		 size_t data_size, uint32_t attributes, mode_t mode)
+_efi_set_variable_mode(efi_guid_t guid, const char *name, uint8_t *data,
+		       size_t data_size, uint32_t attributes, mode_t mode)
 {
 	return ops->set_variable(guid, name, data, data_size, attributes, mode);
 }
-__asm__(".symver efi_set_variable,efi_set_variable@@LIBEFIVAR_0.24");
+__asm__(".symver _efi_set_variable_mode,efi_set_variable@@LIBEFIVAR_0.24");
+
+int
+__attribute__((__nonnull__ (2, 3)))
+__attribute__((__visibility__ ("default")))
+efi_set_variable(efi_guid_t guid, const char *name, uint8_t *data,
+		 size_t data_size, uint32_t attributes, mode_t mode)
+	__attribute((weak, alias ("_efi_set_variable_mode")));
 
 int
 __attribute__((__nonnull__ (2, 3)))
-- 
2.12.2