Commit f53f992a authored by Paul Eggert's avatar Paul Eggert
Browse files

Improve AIX port some more.

With this, it should be as good as it was in 23.3, though it's
still pretty bad: the dumped emacs does not run.  See Mark Fleishman in
http://lists.gnu.org/archive/html/help-gnu-emacs/2011-04/msg00287.html
* unexaix.c (start_of_text): Remove.
(_data, _text): Declare as char[], not int, as AIX manual suggests.
(bias, lnnoptr, text_scnptr, data_scnptr, load_scnptr)
(orig_load_scnptr, orig_data_scnptr):
Now off_t, not long, since they are file offsets.
(make_hdr): Use _data, not start_of_data ().
This is the key part of the fix.
(make_hdr, unrelocate_symbols): Use off_t for file offsets.
(unrelocate_symbols): Cast pointers to intptr_t, not to ulong.

Fixes: debbugs:13650
parent 4458c255
2013-02-12 Paul Eggert <eggert@cs.ucla.edu>
 
Improve AIX port some more (Bug#13650).
With this, it should be as good as it was in 23.3, though it's
still pretty bad: the dumped emacs does not run. See Mark Fleishman in
http://lists.gnu.org/archive/html/help-gnu-emacs/2011-04/msg00287.html
* unexaix.c (start_of_text): Remove.
(_data, _text): Declare as char[], not int, as AIX manual suggests.
(bias, lnnoptr, text_scnptr, data_scnptr, load_scnptr)
(orig_load_scnptr, orig_data_scnptr):
Now off_t, not long, since they are file offsets.
(make_hdr): Use _data, not start_of_data ().
This is the key part of the fix.
(make_hdr, unrelocate_symbols): Use off_t for file offsets.
(unrelocate_symbols): Cast pointers to intptr_t, not to ulong.
* pre-crt0.c (data_start): Initialize to 1.
This ports to compilers that optimize the external declaration
'int x = 0;' as if it were 'int x;' to shrink the executable.
......
......@@ -61,10 +61,8 @@ what you give them. Help stamp out software-hoarding! */
#include "mem-limits.h"
char *start_of_text (void); /* Start of text */
extern int _data;
extern int _text;
extern char _data[];
extern char _text[];
#include <filehdr.h>
#include <aouthdr.h>
......@@ -73,15 +71,15 @@ extern int _text;
static struct filehdr f_hdr; /* File header */
static struct aouthdr f_ohdr; /* Optional file header (a.out) */
static long bias; /* Bias to add for growth */
static long lnnoptr; /* Pointer to line-number info within file */
static off_t bias; /* Bias to add for growth */
static off_t lnnoptr; /* Pointer to line-number info within file */
static long text_scnptr;
static long data_scnptr;
static off_t text_scnptr;
static off_t data_scnptr;
#define ALIGN(val, pwr) (((val) + ((1L<<(pwr))-1)) & ~((1L<<(pwr))-1))
static long load_scnptr;
static long orig_load_scnptr;
static long orig_data_scnptr;
static off_t load_scnptr;
static off_t orig_load_scnptr;
static off_t orig_data_scnptr;
static int unrelocate_symbols (int, int, const char *, const char *);
#ifndef MAX_SECTIONS
......@@ -188,7 +186,7 @@ make_hdr (int new, int a_out,
pagemask = getpagesize () - 1;
/* Adjust text/data boundary. */
data_start = (uintptr_t) start_of_data ();
data_start = (uintptr_t) _data;
data_start = data_start & ~pagemask; /* (Down) to page boundary. */
......@@ -288,7 +286,7 @@ make_hdr (int new, int a_out,
/* fix scnptr's */
{
ulong ptr = section[0].s_scnptr;
off_t ptr = section[0].s_scnptr;
bias = -1;
for (scns = 0; scns < f_hdr.f_nscns; scns++)
......@@ -384,12 +382,12 @@ copy_text_and_data (int new)
char *end;
char *ptr;
lseek (new, (long) text_scnptr, SEEK_SET);
ptr = start_of_text () + text_scnptr;
lseek (new, text_scnptr, SEEK_SET);
ptr = _text + text_scnptr;
end = ptr + f_ohdr.tsize;
write_segment (new, ptr, end);
lseek (new, (long) data_scnptr, SEEK_SET);
lseek (new, data_scnptr, SEEK_SET);
ptr = (char *) f_ohdr.data_start;
end = ptr + f_ohdr.dsize;
write_segment (new, ptr, end);
......@@ -549,13 +547,13 @@ unrelocate_symbols (int new, int a_out,
int i;
LDHDR ldhdr;
LDREL ldrel;
ulong t_reloc = (ulong) &_text - f_ohdr.text_start;
off_t t_reloc = (intptr_t) _text - f_ohdr.text_start;
#ifndef ALIGN_DATA_RELOC
ulong d_reloc = (ulong) &_data - f_ohdr.data_start;
off_t d_reloc = (intptr_t) _data - f_ohdr.data_start;
#else
/* This worked (and was needed) before AIX 4.2.
I have no idea why. -- Mike */
ulong d_reloc = (ulong) &_data - ALIGN (f_ohdr.data_start, 2);
off_t d_reloc = (intptr_t) _data - ALIGN (f_ohdr.data_start, 2);
#endif
int * p;
......@@ -640,16 +638,3 @@ unrelocate_symbols (int new, int a_out,
}
return 0;
}
/*
* Return the address of the start of the text segment prior to
* doing an unexec. After unexec the return value is undefined.
* See crt0.c for further explanation and _start.
*
*/
char *
start_of_text (void)
{
return ((char *) 0x10000000);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment