1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-22 10:26:20 +00:00

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
This commit is contained in:
Paul Eggert 2013-02-12 10:43:11 -08:00
parent 4458c2551b
commit f53f992ad5
2 changed files with 31 additions and 32 deletions

View File

@ -1,5 +1,19 @@
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.

View File

@ -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);
}