mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 04:32:37 +01:00
build: treewide: Set retain attribute
LLD 13 and GNU ld 2.37 support -z start-stop-gc which allows garbage collection of C identifier name sections despite the __start_/__stop_ references. GNU ld before 2015-10 had the behavior as well. Simply set the retain attribute so that GCC 11 (if configure-time binutils is 2.36 or newer)/Clang 13 will set the SHF_GNU_RETAIN section attribute to prevent garbage collection. Without the patch, there are linker errors with -z start-stop-gc (LLD default) when -Wl,--gc-sections is used: ``` ld.lld: error: undefined symbol: __start___eap >>> referenced by eap.c >>> src/eap.o:(eap_init) ``` The remain attribute will not be needed if the metadata sections are referenced by code directly.
This commit is contained in:
parent
9cd1f8a7df
commit
fa1c12453b
@ -83,10 +83,14 @@ struct command_family_desc {
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
#define COMMAND_FAMILY(name, init, exit) \
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
|
||||
static struct command_family_desc __command_family_ ## name \
|
||||
__attribute__((used, section("__command"), aligned(8))) = {\
|
||||
__attribute__((used, retain, \
|
||||
section("__command"), aligned(8))) = { \
|
||||
#name, init, exit \
|
||||
}; \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
|
||||
bool command_init(char **argv, int argc);
|
||||
void command_exit(void);
|
||||
|
@ -118,10 +118,14 @@ struct interface_type_desc {
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
#define INTERFACE_TYPE(interface, init, exit) \
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
|
||||
static struct interface_type_desc __interface_type_ ## interface\
|
||||
__attribute__((used, section("__interface"), aligned(8))) = {\
|
||||
__attribute__((used, retain, section("__interface"), \
|
||||
aligned(8))) = { \
|
||||
#interface, init, exit \
|
||||
}; \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
|
||||
bool dbus_proxy_init(void);
|
||||
bool dbus_proxy_exit(void);
|
||||
|
@ -94,10 +94,14 @@ struct eap_method_desc {
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
#define EAP_METHOD_BUILTIN(name, init, exit) \
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
|
||||
static struct eap_method_desc __eap_builtin_ ## name \
|
||||
__attribute__((used, section("__eap"), aligned(8))) = { \
|
||||
__attribute__((used, retain, section("__eap"), \
|
||||
aligned(8))) = { \
|
||||
#name, init, exit \
|
||||
}; \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
|
||||
int eap_register_method(struct eap_method *method);
|
||||
int eap_unregister_method(struct eap_method *method);
|
||||
|
24
src/module.h
24
src/module.h
@ -33,19 +33,25 @@ struct iwd_module_depends {
|
||||
};
|
||||
|
||||
#define IWD_MODULE(name, init, exit) \
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
|
||||
static struct iwd_module_desc __iwd_module_ ## name \
|
||||
__attribute__((used, section("__iwd_module"), aligned(8))) = {\
|
||||
__attribute__((used, retain, section("__iwd_module"), \
|
||||
aligned(8))) = { \
|
||||
#name, init, exit \
|
||||
};
|
||||
}; \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
|
||||
#define IWD_MODULE_DEPENDS(name, dep) \
|
||||
static struct iwd_module_depends \
|
||||
__iwd_module__##name##_##dep \
|
||||
__attribute__((used, section("__iwd_module_dep"), \
|
||||
aligned(8))) = { \
|
||||
.self = #name, \
|
||||
.target = #dep, \
|
||||
};
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wattributes\"") \
|
||||
static struct iwd_module_depends __iwd_module__##name##_##dep \
|
||||
__attribute__((used, retain, \
|
||||
section("__iwd_module_dep"), aligned(8))) = { \
|
||||
.self = #name, \
|
||||
.target = #dep, \
|
||||
}; \
|
||||
_Pragma("GCC diagnostic pop")
|
||||
|
||||
int iwd_modules_init(void);
|
||||
void iwd_modules_exit(void);
|
||||
|
Loading…
Reference in New Issue
Block a user