aboutsummaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2015-03-04 18:48:19 +0000
committerMichael Brown <mcb30@ipxe.org>2015-03-05 00:59:38 +0000
commitfbc4ba4b4ed13cc86cb8fdea0bac6c3be0164ed5 (patch)
treea0c504e297806aa88e89a04e694333a7c5172757 /src/net
parent86ae6e6c1836e43993a14db278398fc54e5419bd (diff)
downloadipxe-fbc4ba4b4ed13cc86cb8fdea0bac6c3be0164ed5.zip
ipxe-fbc4ba4b4ed13cc86cb8fdea0bac6c3be0164ed5.tar.gz
ipxe-fbc4ba4b4ed13cc86cb8fdea0bac6c3be0164ed5.tar.bz2
[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>
Diffstat (limited to 'src/net')
-rw-r--r--src/net/80211/net80211.c3
-rw-r--r--src/net/80211/wpa.c1
-rw-r--r--src/net/ethernet.c3
-rw-r--r--src/net/fc.c3
-rw-r--r--src/net/infiniband.c3
-rw-r--r--src/net/ipv4.c3
-rw-r--r--src/net/ipv6.c3
7 files changed, 19 insertions, 0 deletions
diff --git a/src/net/80211/net80211.c b/src/net/80211/net80211.c
index d2051f6..0079459 100644
--- a/src/net/80211/net80211.c
+++ b/src/net/80211/net80211.c
@@ -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 );
diff --git a/src/net/80211/wpa.c b/src/net/80211/wpa.c
index e2c4945..77f66d8 100644
--- a/src/net/80211/wpa.c
+++ b/src/net/80211/wpa.c
@@ -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 );
diff --git a/src/net/ethernet.c b/src/net/ethernet.c
index a4bdfd4..33e0572 100644
--- a/src/net/ethernet.c
+++ b/src/net/ethernet.c
@@ -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 );
diff --git a/src/net/fc.c b/src/net/fc.c
index 459f6fc..2e80702 100644
--- a/src/net/fc.c
+++ b/src/net/fc.c
@@ -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 );
diff --git a/src/net/infiniband.c b/src/net/infiniband.c
index 7e545f7..8ba031f 100644
--- a/src/net/infiniband.c
+++ b/src/net/infiniband.c
@@ -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 );
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index 85ee5a6..ed22c4d 100644
--- a/src/net/ipv4.c
+++ b/src/net/ipv4.c
@@ -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 );
diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index 3c37416..c5bead1 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -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 );