Thread View: gnu.utils.bug
1 messages
1 total messages
Started by Glenn Engel
Wed, 15 Feb 1989 20:53
relocating data segment
Author: Glenn Engel
Date: Wed, 15 Feb 1989 20:53
Date: Wed, 15 Feb 1989 20:53
138 lines
4597 bytes
4597 bytes
This patch adds the capability to relocate the data segment start
address. I've successfully used this patched ld to burn roms for our
rom-based prototype. The flag "R" is used to specify the address,
much like the "T" option. (The use of "R", of course, is arbitrary.)
I'm also checking for overlapping segments, assuming the data and
bss segments occupy a contiguous area. A check is made to see that
the text doesn't run into the data area and vice versa.
--
bam bam%hplsla@hplabs.hp.com
(In Real Life: Ben Mejia at HP Lake Stevens Instrument Division)
(206) 335-2203
"May the forces of evil become confused on the way to
your house." -- George Carlin
--- snip ----
*** ld-1.27.c.orig Thu Feb 9 12:03:28 1989
--- ld.c Thu Feb 9 11:26:31 1989
***************
*** 409,414
This prevents text_start from being set later to default values. */
int T_flag_specified;
/* Size to pad data section up to.
We simply increase the size of the data section, padding with zeros,
and reduce the size of the bss section to match. */
--- 409,418 -----
This prevents text_start from being set later to default values. */
int T_flag_specified;
+ /* Nonzero if -R was specified in the command line.
+ This prevents data_start from being set later to default values. */
+ int R_flag_specified;
+
/* Size to pad data section up to.
We simply increase the size of the data section, padding with zeros,
and reduce the size of the bss section to match. */
***************
*** 592,597
relocatable_output = 0;
force_common_definition = 0;
T_flag_specified = 0;
magic = ZMAGIC;
#ifdef hp9000s300
magic = NMAGIC; /* hp-ux bug screws ZMAGIC */
--- 596,602 -----
relocatable_output = 0;
force_common_definition = 0;
T_flag_specified = 0;
+ R_flag_specified = 0;
magic = ZMAGIC;
#ifdef hp9000s300
magic = NMAGIC; /* hp-ux bug screws ZMAGIC */
***************
*** 688,693
case 'L':
case 'l':
case 'o':
case 'T':
case 'u':
case 'y':
--- 693,699 -----
case 'L':
case 'l':
case 'o':
+ case 'R':
case 'T':
case 'u':
case 'y':
***************
*** 867,872
output_filename = arg;
return;
case 'r':
relocatable_output = 1;
magic = OMAGIC;
--- 873,883 -----
output_filename = arg;
return;
+ case 'R':
+ data_start = parse (arg, "%x", "invalid argument to -R");
+ R_flag_specified = 1;
+ return;
+
case 'r':
relocatable_output = 1;
magic = OMAGIC;
***************
*** 2143,2149
outheader.a_text = text_size;
! /* Make the data segment address start in memory on a suitable boundary. */
data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
--- 2154,2161 -----
outheader.a_text = text_size;
! /* Use the data segment address specified by the -R flag or select */
! /* a data segment address on a suitable boundary. */
if (!R_flag_specified)
data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
***************
*** 2145,2151
/* Make the data segment address start in memory on a suitable boundary. */
! data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
/* Compute start addresses of each file's sections and symbols. */
--- 2157,2169 -----
/* Use the data segment address specified by the -R flag or select */
/* a data segment address on a suitable boundary. */
! if (!R_flag_specified)
! data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
! else
! if ((data_start <
! N_DATADDR (outheader) + text_start - N_TXTADDR (outheader)) &&
! (data_start + data_size + bss_size > text_start))
! fatal ("Segments overlap.");
/* Compute start addresses of each file's sections and symbols. */
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads