mirror of
https://github.com/ipxe/ipxe
synced 2026-01-01 17:34:42 +03:00
[build] Fix the REQUIRE_SYMBOL mechanism
At some point in the past few years, binutils became more aggressive at removing unused symbols. To function as a symbol requirement, a relocation record must now be in a section marked with @progbits and must not be in a section which gets discarded during the link (either via --gc-sections or via /DISCARD/). Update REQUIRE_SYMBOL() to generate relocation records meeting these criteria. To minimise the impact upon the final binary size, we use existing symbols (specified via the REQUIRING_SYMBOL() macro) as the relocation targets where possible. We use R_386_NONE or R_X86_64_NONE relocation types to prevent any actual unwanted relocation taking place. Where no suitable symbol exists for REQUIRING_SYMBOL() (such as in config.c), the macro PROVIDE_REQUIRING_SYMBOL() can be used to generate a one-byte-long symbol to act as the relocation target. If there are versions of binutils for which this approach fails, then the fallback will probably involve killing off REQUEST_SYMBOL(), redefining REQUIRE_SYMBOL() to use the current definition of REQUEST_SYMBOL(), and postprocessing the linked ELF file with something along the lines of "nm -u | wc -l" to check that there are no undefined symbols remaining. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -2827,5 +2827,8 @@ struct errortab common_wireless_errors[] __errortab = {
|
||||
__einfo_errortab ( EINFO_ECONNREFUSED_AUTH_ALGO_UNSUPP ),
|
||||
};
|
||||
|
||||
/* Drag in objects via net80211_ll_protocol */
|
||||
REQUIRING_SYMBOL ( net80211_ll_protocol );
|
||||
|
||||
/* Drag in 802.11 configuration */
|
||||
REQUIRE_OBJECT ( config_net80211 );
|
||||
|
||||
@@ -912,4 +912,5 @@ struct eapol_handler eapol_key_handler __eapol_handler = {
|
||||
};
|
||||
|
||||
/* WPA always needs EAPOL in order to be useful */
|
||||
REQUIRING_SYMBOL ( eapol_key_handler );
|
||||
REQUIRE_OBJECT ( eapol );
|
||||
|
||||
@@ -239,6 +239,9 @@ struct net_device * alloc_etherdev ( size_t priv_size ) {
|
||||
return netdev;
|
||||
}
|
||||
|
||||
/* Drag in objects via ethernet_protocol */
|
||||
REQUIRING_SYMBOL ( ethernet_protocol );
|
||||
|
||||
/* Drag in Ethernet configuration */
|
||||
REQUIRE_OBJECT ( config_ethernet );
|
||||
|
||||
|
||||
@@ -1940,5 +1940,8 @@ struct fc_ulp * fc_ulp_get_port_id_type ( struct fc_port *port,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Drag in objects via fc_ports */
|
||||
REQUIRING_SYMBOL ( fc_ports );
|
||||
|
||||
/* Drag in Fibre Channel configuration */
|
||||
REQUIRE_OBJECT ( config_fc );
|
||||
|
||||
@@ -999,6 +999,9 @@ struct ib_device * last_opened_ibdev ( void ) {
|
||||
return ibdev;
|
||||
}
|
||||
|
||||
/* Drag in objects via register_ibdev() */
|
||||
REQUIRING_SYMBOL ( register_ibdev );
|
||||
|
||||
/* Drag in Infiniband configuration */
|
||||
REQUIRE_OBJECT ( config_infiniband );
|
||||
|
||||
|
||||
@@ -841,5 +841,8 @@ struct settings_applicator ipv4_settings_applicator __settings_applicator = {
|
||||
.apply = ipv4_create_routes,
|
||||
};
|
||||
|
||||
/* Drag in objects via ipv4_protocol */
|
||||
REQUIRING_SYMBOL ( ipv4_protocol );
|
||||
|
||||
/* Drag in ICMPv4 */
|
||||
REQUIRE_OBJECT ( icmpv4 );
|
||||
|
||||
@@ -1104,6 +1104,9 @@ struct net_driver ipv6_driver __net_driver = {
|
||||
.remove = ipv6_remove,
|
||||
};
|
||||
|
||||
/* Drag in objects via ipv6_protocol */
|
||||
REQUIRING_SYMBOL ( ipv6_protocol );
|
||||
|
||||
/* Drag in ICMPv6 */
|
||||
REQUIRE_OBJECT ( icmpv6 );
|
||||
|
||||
|
||||
Reference in New Issue
Block a user