[syslinux:master] ld: Use ABSOLUTE() when taking differences between relative symbols

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Fri Apr 1 13:03:27 PDT 2011


Commit-ID:  6fa865966e7121ef7d430ac5f8916993300f5e1b
Gitweb:     http://syslinux.zytor.com/commit/6fa865966e7121ef7d430ac5f8916993300f5e1b
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Fri, 1 Apr 2011 12:59:04 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Fri, 1 Apr 2011 12:59:04 -0700

ld: Use ABSOLUTE() when taking differences between relative symbols

binutils 2.21.51.0.6, and possibly other versions, generate the wrong
result when subtracting two section-relative symbols (the final result
ends up having the base of the section incorrectly added to it.)  Work
around this by using ABSOLUTE() on the symbols to force the result to
become absolute.

Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>


---
 core/syslinux.ld |   44 ++++++++++++++++++++++----------------------
 dos/dosexe.ld    |    6 +++---
 2 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/core/syslinux.ld b/core/syslinux.ld
index c1c884c..40a0139 100644
--- a/core/syslinux.ld
+++ b/core/syslinux.ld
@@ -36,7 +36,7 @@ SECTIONS
 		*(.earlybss)
 		__earlybss_end = .;
 	}
-	__earlybss_len = __earlybss_end - __earlybss_start;
+	__earlybss_len = ABSOLUTE(__earlybss_end) - ABSOLUTE(__earlybss_start);
 	__earlybss_dwords = (__earlybss_len + 3) >> 2;
 
 	. = ALIGN(4);
@@ -45,7 +45,7 @@ SECTIONS
 		*(.bss16)
 		__bss16_end = .;
 	}
-	__bss16_len = __bss16_end - __bss16_start;
+	__bss16_len = ABSOLUTE(__bss16_end) - ABSOLUTE(__bss16_start);
 	__bss16_dwords = (__bss16_len + 3) >> 2;
 
 	. = ALIGN(4);
@@ -54,7 +54,7 @@ SECTIONS
 		*(.config)
 		__config_end = .;
 	}
-	__config_len = __config_end - __config_start;
+	__config_len = ABSOLUTE(__config_end) - ABSOLUTE(__config_start);
 	__config_dwords = (__config_len + 3) >> 2;
 
 	/* Generated and/or copied code */
@@ -65,7 +65,7 @@ SECTIONS
 		*(.replacestub)
 		__replacestub_end = .;
 	}
-	__replacestub_len = __replacestub_end - __replacestub_start;
+	__replacestub_len = ABSOLUTE(__replacestub_end) - ABSOLUTE(__replacestub_start);
 	__replacestub_dwords = (__replacestub_len + 3) >> 2;
 
 	. = ALIGN(16);
@@ -75,7 +75,7 @@ SECTIONS
 		*(.gentextnr)
 		__gentextnr_end = .;
 	}
-	__gentextnr_len = __gentextnr_end - __gentextnr_start;
+	__gentextnr_len = ABSOLUTE(__gentextnr_end) - ABSOLUTE(__gentextnr_start);
 	__gentextnr_dwords = (__gentextnr_len + 3) >> 2;
 
 	. = STACK_BASE;
@@ -84,7 +84,7 @@ SECTIONS
 		. += STACK_LEN;
 		__stack16_end = .;
 	}
-	__stack16_len = __stack16_end - __stack16_start;
+	__stack16_len = ABSOLUTE(__stack16_end) - ABSOLUTE(__stack16_start);
 	__stack16_dwords = (__stack16_len + 3) >> 2;
 
 	/* Initialized sections */
@@ -96,7 +96,7 @@ SECTIONS
 		*(.init)
 		__init_end = .;
 	}
-	__init_len = __init_end - __init_start;
+	__init_len = ABSOLUTE(__init_end) - ABSOLUTE(__init_start);
 	__init_dwords = (__init_len + 3) >> 2;
 
 	.text16 : {
@@ -105,7 +105,7 @@ SECTIONS
 		*(.text16)
 		__text16_end = .;
 	}
-	__text16_len = __text16_end - __text16_start;
+	__text16_len = ABSOLUTE(__text16_end) - ABSOLUTE(__text16_start);
 	__text16_dwords = (__text16_len + 3) >> 2;
 
 	/*
@@ -119,7 +119,7 @@ SECTIONS
 		*(.textnr)
 		__textnr_end = .;
 	}
-	__textnr_len = __textnr_end - __textnr_start;
+	__textnr_len = ABSOLUTE(__textnr_end) - ABSOLUTE(__textnr_start);
 	__textnr_dwords = (__textnr_len + 3) >> 2;
 
 	. = ALIGN(16);
@@ -131,7 +131,7 @@ SECTIONS
 		*(.bcopyxx.text)
 		__bcopyxx_text_end = .;
 	}
-	__bcopyxx_text_len = __bcopyxx_text_end - __bcopyxx_text_start;
+	__bcopyxx_text_len = ABSOLUTE(__bcopyxx_text_end) - ABSOLUTE(__bcopyxx_text_start);
 	__bcopyxx_text_dwords = (__bcopyxx_text_len + 3) >> 2;
 
 	.bcopyxx.data : {
@@ -139,11 +139,11 @@ SECTIONS
 		*(.bcopyxx.text)
 		__bcopyxx_data_end = .;
 	}
-	__bcopyxx_data_len = __bcopyxx_data_end - __bcopyxx_data_start;
+	__bcopyxx_data_len = ABSOLUTE(__bcopyxx_data_end) - ABSOLUTE(__bcopyxx_data_start);
 	__bcopyxx_data_dwords = (__bcopyxx_data_len + 3) >> 2;
 
 	__bcopyxx_end = .;
-	__bcopyxx_len = __bcopyxx_end - __bcopyxx_start;
+	__bcopyxx_len = ABSOLUTE(__bcopyxx_end) - ABSOLUTE(__bcopyxx_start);
 	__bcopyxx_dwords = (__bcopyxx_len + 3) >> 2;
 
 	. = ALIGN(4);
@@ -152,7 +152,7 @@ SECTIONS
 	      *(.data16)
 	      __data16_end = .;
 	}
-	__data16_len = __data16_end - __data16_start;
+	__data16_len = ABSOLUTE(__data16_end) - ABSOLUTE(__data16_start);
 	__data16_dwords = (__data16_len + 3) >> 2;
 
 	. = ALIGN(4);
@@ -176,7 +176,7 @@ SECTIONS
 		*(.adv)
 		__adv_end = .;
 	}
-	__adv_len = __adv_end - __adv_start;
+	__adv_len = ABSOLUTE(__adv_end) - ABSOLUTE(__adv_start);
 	__adv_dwords = (__adv_len + 3) >> 2;
 
 	/* Late uninitialized sections */
@@ -187,7 +187,7 @@ SECTIONS
 		*(.uibss)
 		__uibss_end = .;
 	}
-	__uibss_len = __uibss_end - __uibss_start;
+	__uibss_len = ABSOLUTE(__uibss_end) - ABSOLUTE(__uibss_start);
 	__uibss_dwords = (__uibss_len + 3) >> 2;
 
 	_end16 = .;
@@ -220,7 +220,7 @@ SECTIONS
 		*(.auxseg)
 		__auxseg_end = .;
 	}
-	__auxseg_len = __auxseg_end - __auxseg_start;
+	__auxseg_len = ABSOLUTE(__auxseg_end) - ABSOLUTE(__auxseg_start);
 	__auxseg_dwords = (__auxseg_len + 3) >> 2;
 	aux_seg = __auxseg_start >> 4;
 
@@ -232,12 +232,12 @@ SECTIONS
 		*(.lowmem)
 		__lowmem_end = .;
 	}
-	__lowmem_len = __lowmem_end - __lowmem_start;
+	__lowmem_len = ABSOLUTE(__lowmem_end) - ABSOLUTE(__lowmem_start);
 	__lowmem_dwords = (__lowmem_len + 3) >> 2;
 
 	__high_clear_end = .;
 
-	__high_clear_len = __high_clear_end - __high_clear_start;
+	__high_clear_len = ABSOLUTE(__high_clear_end) - ABSOLUTE(__high_clear_start);
 	__high_clear_dwords = (__high_clear_len + 3) >> 2;
 
 	/* Start of the lowmem heap */
@@ -325,7 +325,7 @@ SECTIONS
 	}
 
 	__pm_code_end = .;
-	__pm_code_len = __pm_code_end - __pm_code_start;
+	__pm_code_len = ABSOLUTE(__pm_code_end) - ABSOLUTE(__pm_code_start);
 	__pm_code_dwords = (__pm_code_len + 3) >> 2;
 
 	. = ALIGN(128);
@@ -339,7 +339,7 @@ SECTIONS
 		*(COMMON)
 		__bss_end = .;
 	}
-	__bss_len = __bss_end - __bss_start;
+	__bss_len = ABSOLUTE(__bss_end) - ABSOLUTE(__bss_start);
 	__bss_dwords = (__bss_len + 3) >> 2;
 
 	/* Very large objects which don't need to be zeroed */
@@ -352,7 +352,7 @@ SECTIONS
 		*(.hugebss.*)
 		__hugebss_end = .;
 	}
-	__hugebss_len = __hugebss_end - __hugebss_start;
+	__hugebss_len = ABSOLUTE(__hugebss_end) - ABSOLUTE(__hugebss_start);
 	__hugebss_dwords = (__hugebss_len + 3) >> 2;
 
 
@@ -364,7 +364,7 @@ SECTIONS
 		*(.stack)
 		__stack_end = .;
 	}
-	__stack_len = __stack_end - __stack_start;
+	__stack_len = ABSOLUTE(__stack_end) - ABSOLUTE(__stack_start);
 	__stack_dwords = (__stack_len + 3) >> 2;
 
 	_end = .;
diff --git a/dos/dosexe.ld b/dos/dosexe.ld
index 833368a..76bfc75 100644
--- a/dos/dosexe.ld
+++ b/dos/dosexe.ld
@@ -27,12 +27,12 @@ SECTIONS
 	__payload_lma = .;
 
 	. = 0x100000000 - syslinux_ldlinux_size;
-	__payload_start = .;
 	.payload : AT (__payload_lma) {
+		 __payload_start = .;
 		 *(.payload)
+		 __payload_end = .;
 	}
-	__payload_end = .;
-	__payload_len = __payload_end - __payload_start;
+	__payload_len = ABSOLUTE(__payload_end) - ABSOLUTE(__payload_start);
 	__payload_dwords = __payload_len >> 2;
 
 	__text_lma = __payload_lma + syslinux_ldlinux_size;



More information about the Syslinux-commits mailing list