Accepting request 439871 from editors
- Avoid address space randomization during emacs build - Check for active Execution Shield as this breaks emacs - Diable experimental cairo support as it cause trouble with spacemacs as well as with the w3 mode - Update to emacs version 25.1 * Next major release * Xwidgets: a new feature for embedding native widgets inside Emacs buffers. * Emacs can now load shared/dynamic libraries (modules). * Network security (TLS/SSL certificate validity and the like) * 'C-h l' now also lists the commands that were run. * New option 'switch-to-buffer-in-dedicated-window' * The option 'even-window-heights' has been renamed to 'even-window-sizes' * 'terpri' gets an optional arg ENSURE to conditionally output a newline. * 'insert-register' now leaves point after the inserted text * The new variable 'term-file-aliases' replaces some files from lisp/term. * New variable 'system-configuration-features', listing some of the main features that Emacs was compiled with. * A password is now hidden also when typed in batch mode. * The Emacs pseudo-random number generator can be securely seeded. * New input methods: 'tamil-dvorak', 'programmer-dvorak' and 'probhat'. * 'M-x' suggests shorthands and ignores obsolete commands for completion. * Changes in undo * New command 'comment-line' bound to 'C-x C-;'. * New and improved facilities for inserting Unicode characters * New minor mode 'global-eldoc-mode' is enabled by default. * Emacs now uses "bracketed paste mode" on text terminals that support it. * Emacs now supports the latest version of the UBA. * You can access 'mouse-buffer-menu' ('C-down-mouse-1') using 'C-f10'. OBS-URL: https://build.opensuse.org/request/show/439871 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/emacs?expand=0&rev=126
This commit is contained in:
commit
29285a68e3
@ -16,5 +16,13 @@ case $BUILD_BASENAME in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
exec_shield=0
|
||||||
|
if test -e /proc/sys/kernel/exec-shield; then
|
||||||
|
read -t 1 exec_shield < /proc/sys/kernel/exec-shield
|
||||||
|
fi
|
||||||
|
if test $exec_shield -ne 0 ; then
|
||||||
|
echo Sorry, Execution Shield exists and is enabled 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
|
|
|
||||||
| Compare with
|
|
||||||
| https://lists.gnu.org/archive/html/bug-gnu-emacs/2015-07/msg00287.html
|
|
||||||
|
|
|
||||||
| Based on git commit 4d7e6e51dd4acecff466a28d958c50f34fc130b8
|
|
||||||
|
|
||||||
From: Mike Crowe
|
|
||||||
Subject: [PATCH] Re-enable SIGIO when waiting for events
|
|
||||||
Date: Sat, 11 Jul 2015 12:58:00 +0100
|
|
||||||
|
|
||||||
Pasting a large string into an Emacs tty frame causes
|
|
||||||
keyboard.c:kbd_buffer_store_buffered_event to call ignore_sigio()
|
|
||||||
which sets SIGIO to SIG_IGN.
|
|
||||||
|
|
||||||
Unfortunately no-one seems to ever re-enable the SIGIO handler.
|
|
||||||
|
|
||||||
This leads to timeouts when attempting to paste into an Emacs X11
|
|
||||||
frame as reported at
|
|
||||||
http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16737 .
|
|
||||||
|
|
||||||
It appears that keyboard.c:kbd_buffer_get_event used to re-enable the
|
|
||||||
signal handler but that was removed as part of a large signal-handling
|
|
||||||
clean up in 4d7e6e51dd4acecff466a28d958c50f34fc130b8.
|
|
||||||
|
|
||||||
Reinstating the re-enabling of SIGIO in kbd_buffer_get_event solves
|
|
||||||
the problems reported in bug 16737 for me.
|
|
||||||
|
|
||||||
* src/keyboard.c (kbd_buffer_get_event): Re-enable SIGIO when waiting
|
|
||||||
for event.
|
|
||||||
---
|
|
||||||
src/keyboard.c | 10 ++++++++++
|
|
||||||
1 file changed, 10 insertions(+)
|
|
||||||
|
|
||||||
--- src/keyboard.c
|
|
||||||
+++ src/keyboard.c 2016-03-10 07:39:35.770752804 +0000
|
|
||||||
@@ -364,6 +364,8 @@ static ptrdiff_t echo_length (void);
|
|
||||||
|
|
||||||
static Lisp_Object Qpolling_period;
|
|
||||||
|
|
||||||
+static void deliver_input_available_signal (int sig);
|
|
||||||
+
|
|
||||||
/* Incremented whenever a timer is run. */
|
|
||||||
unsigned timers_run;
|
|
||||||
|
|
||||||
@@ -3829,6 +3831,14 @@ kbd_buffer_get_event (KBOARD **kbp,
|
|
||||||
/* Start reading input again because we have processed enough to
|
|
||||||
be able to accept new events again. */
|
|
||||||
unhold_keyboard_input ();
|
|
||||||
+#ifdef USABLE_SIGIO
|
|
||||||
+ if (!noninteractive)
|
|
||||||
+ {
|
|
||||||
+ struct sigaction action;
|
|
||||||
+ emacs_sigaction_init (&action, deliver_input_available_signal);
|
|
||||||
+ sigaction (SIGIO, &action, 0);
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
start_polling ();
|
|
||||||
}
|
|
||||||
#endif /* subprocesses */
|
|
@ -1,69 +0,0 @@
|
|||||||
From 0a97fb1992c8cc3612a2358f576f774ea1f36777 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:28:59 -0800
|
|
||||||
Subject: ELF unexec: Correct section header index
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [1/10]:
|
|
||||||
|
|
||||||
ELF unexec: Correct section header index
|
|
||||||
|
|
||||||
First a small fix. The code incorrectly uses "NEW_SECTION_H (n)" when
|
|
||||||
it should have been using "NEW_SECTION_H (nn)" to find the name of the
|
|
||||||
section currently being processed. Of course, before the bss
|
|
||||||
sections, n and nn have the same value, so this doesn't matter except
|
|
||||||
in the case of .sbss. For .sbss this probably meant .bss (most likely
|
|
||||||
the next section) was copied from memory. A later patch removes the
|
|
||||||
bogus .sbss handling anyway.
|
|
||||||
|
|
||||||
* unexelf.c (unexec): Use correct index to look up names.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 0bcd08ef052bca9b8d08696068c2a0c387d0dd56
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 16 ++++++++--------
|
|
||||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index 59e2725..d4a36f8 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -1016,12 +1016,12 @@ temacs:
|
|
||||||
/* Write out the sections. .data and .data1 (and data2, called
|
|
||||||
".data" in the strings table) get copied from the current process
|
|
||||||
instead of the old file. */
|
|
||||||
- if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".sdata")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".lit4")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".lit8")
|
|
||||||
/* The conditional bit below was in Oliva's original code
|
|
||||||
(1999-08-25) and seems to have been dropped by mistake
|
|
||||||
@@ -1044,14 +1044,14 @@ temacs:
|
|
||||||
loader, but I never got anywhere with an SGI support call
|
|
||||||
seeking clues. -- fx 2002-11-29. */
|
|
||||||
#ifdef IRIX6_5
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".got")
|
|
||||||
#endif
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".sdata1")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".data1")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
|
|
||||||
+ || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
".sbss"))
|
|
||||||
src = (caddr_t) OLD_SECTION_H (n).sh_addr;
|
|
||||||
else
|
|
@ -1,422 +0,0 @@
|
|||||||
From 9fa97f0c2c1afae39b6662a836910deb1e0130ad Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:28:59 -0800
|
|
||||||
Subject: ELF unexec: Tidy code
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [2/10]:
|
|
||||||
|
|
||||||
ELF unexec: Tidy code
|
|
||||||
|
|
||||||
Separate out some of the more mechanical changes so following patches
|
|
||||||
are smaller.
|
|
||||||
|
|
||||||
* unexelf.c (unexec): Rearrange initialisation of program
|
|
||||||
header vars. Use pointer vars in loops rather than indexing
|
|
||||||
section header array via macros. Simplify _OBJC_ sym code
|
|
||||||
and reloc handling code.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 856f4eaba8a76953e0bbcfc7ebb0ca4f2e3cf351
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 210 +++++++++++++++++++++++++++-------------------------------
|
|
||||||
1 file changed, 96 insertions(+), 114 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index d4a36f8..f7465cb 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -813,20 +813,11 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
if (new_base == MAP_FAILED)
|
|
||||||
fatal ("Can't allocate buffer for %s: %s", old_name, strerror (errno));
|
|
||||||
|
|
||||||
- new_file_h = (ElfW (Ehdr) *) new_base;
|
|
||||||
- new_program_h = (ElfW (Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
|
|
||||||
- new_section_h = (ElfW (Shdr) *)
|
|
||||||
- ((byte *) new_base + old_file_h->e_shoff + new_data2_incr);
|
|
||||||
-
|
|
||||||
/* Make our new file, program and section headers as copies of the
|
|
||||||
originals. */
|
|
||||||
|
|
||||||
+ new_file_h = (ElfW (Ehdr) *) new_base;
|
|
||||||
memcpy (new_file_h, old_file_h, old_file_h->e_ehsize);
|
|
||||||
- memcpy (new_program_h, old_program_h,
|
|
||||||
- old_file_h->e_phnum * old_file_h->e_phentsize);
|
|
||||||
-
|
|
||||||
- /* Modify the e_shstrndx if necessary. */
|
|
||||||
- PATCH_INDEX (new_file_h->e_shstrndx);
|
|
||||||
|
|
||||||
/* Fix up file header. We'll add one section. Section header is
|
|
||||||
further away now. */
|
|
||||||
@@ -834,6 +825,16 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
new_file_h->e_shoff += new_data2_incr;
|
|
||||||
new_file_h->e_shnum += 1;
|
|
||||||
|
|
||||||
+ /* Modify the e_shstrndx if necessary. */
|
|
||||||
+ PATCH_INDEX (new_file_h->e_shstrndx);
|
|
||||||
+
|
|
||||||
+ new_program_h = (ElfW (Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
|
|
||||||
+ new_section_h = (ElfW (Shdr) *)
|
|
||||||
+ ((byte *) new_base + old_file_h->e_shoff + new_data2_incr);
|
|
||||||
+
|
|
||||||
+ memcpy (new_program_h, old_program_h,
|
|
||||||
+ old_file_h->e_phnum * old_file_h->e_phentsize);
|
|
||||||
+
|
|
||||||
#ifdef UNEXELF_DEBUG
|
|
||||||
DEBUG_LOG (old_file_h->e_shoff);
|
|
||||||
fprintf (stderr, "Old section count %td\n", (ptrdiff_t) old_file_h->e_shnum);
|
|
||||||
@@ -906,32 +907,35 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
for (n = 1, nn = 1; n < old_file_h->e_shnum; n++, nn++)
|
|
||||||
{
|
|
||||||
caddr_t src;
|
|
||||||
+ ElfW (Shdr) *old_shdr = &OLD_SECTION_H (n);
|
|
||||||
+ ElfW (Shdr) *new_shdr = &NEW_SECTION_H (nn);
|
|
||||||
+
|
|
||||||
/* If it is (s)bss section, insert the new data2 section before it. */
|
|
||||||
/* new_data2_index is the index of either old_sbss or old_bss, that was
|
|
||||||
chosen as a section for new_data2. */
|
|
||||||
if (n == new_data2_index)
|
|
||||||
{
|
|
||||||
/* Steal the data section header for this data2 section. */
|
|
||||||
- memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
|
|
||||||
+ memcpy (new_shdr, &OLD_SECTION_H (old_data_index),
|
|
||||||
new_file_h->e_shentsize);
|
|
||||||
|
|
||||||
- NEW_SECTION_H (nn).sh_addr = new_data2_addr;
|
|
||||||
- NEW_SECTION_H (nn).sh_offset = new_data2_offset;
|
|
||||||
- NEW_SECTION_H (nn).sh_size = new_data2_size;
|
|
||||||
+ new_shdr->sh_addr = new_data2_addr;
|
|
||||||
+ new_shdr->sh_offset = new_data2_offset;
|
|
||||||
+ new_shdr->sh_size = new_data2_size;
|
|
||||||
/* Use the bss section's alignment. This will assure that the
|
|
||||||
new data2 section always be placed in the same spot as the old
|
|
||||||
bss section by any other application. */
|
|
||||||
- NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (n).sh_addralign;
|
|
||||||
+ new_shdr->sh_addralign = old_shdr->sh_addralign;
|
|
||||||
|
|
||||||
/* Now copy over what we have in the memory now. */
|
|
||||||
- memcpy (NEW_SECTION_H (nn).sh_offset + new_base,
|
|
||||||
- (caddr_t) OLD_SECTION_H (n).sh_addr,
|
|
||||||
+ memcpy (new_shdr->sh_offset + new_base,
|
|
||||||
+ (caddr_t) old_shdr->sh_addr,
|
|
||||||
new_data2_size);
|
|
||||||
nn++;
|
|
||||||
+ new_shdr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
- memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
|
|
||||||
- old_file_h->e_shentsize);
|
|
||||||
+ memcpy (new_shdr, old_shdr, old_file_h->e_shentsize);
|
|
||||||
|
|
||||||
if (n == old_bss_index
|
|
||||||
/* The new bss and sbss section's size is zero, and its file offset
|
|
||||||
@@ -940,13 +944,13 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
/* NN should be `old_s?bss_index + 1' at this point. */
|
|
||||||
- NEW_SECTION_H (nn).sh_offset = new_data2_offset + new_data2_size;
|
|
||||||
- NEW_SECTION_H (nn).sh_addr = new_data2_addr + new_data2_size;
|
|
||||||
+ new_shdr->sh_offset = new_data2_offset + new_data2_size;
|
|
||||||
+ new_shdr->sh_addr = new_data2_addr + new_data2_size;
|
|
||||||
/* Let the new bss section address alignment be the same as the
|
|
||||||
section address alignment followed the old bss section, so
|
|
||||||
this section will be placed in exactly the same place. */
|
|
||||||
- NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign;
|
|
||||||
- NEW_SECTION_H (nn).sh_size = 0;
|
|
||||||
+ new_shdr->sh_addralign = OLD_SECTION_H (nn).sh_addralign;
|
|
||||||
+ new_shdr->sh_size = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -976,53 +980,50 @@ temacs:
|
|
||||||
25 1709 0x4 0x10
|
|
||||||
*/
|
|
||||||
|
|
||||||
- if (NEW_SECTION_H (nn).sh_offset >= old_bss_offset
|
|
||||||
- || (NEW_SECTION_H (nn).sh_offset + NEW_SECTION_H (nn).sh_size
|
|
||||||
+ if (new_shdr->sh_offset >= old_bss_offset
|
|
||||||
+ || (new_shdr->sh_offset + new_shdr->sh_size
|
|
||||||
> new_data2_offset))
|
|
||||||
- NEW_SECTION_H (nn).sh_offset += new_data2_incr;
|
|
||||||
+ new_shdr->sh_offset += new_data2_incr;
|
|
||||||
|
|
||||||
/* Any section that was originally placed after the section
|
|
||||||
header table should now be off by the size of one section
|
|
||||||
header table entry. */
|
|
||||||
- if (NEW_SECTION_H (nn).sh_offset > new_file_h->e_shoff)
|
|
||||||
- NEW_SECTION_H (nn).sh_offset += new_file_h->e_shentsize;
|
|
||||||
+ if (new_shdr->sh_offset > new_file_h->e_shoff)
|
|
||||||
+ new_shdr->sh_offset += new_file_h->e_shentsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If any section hdr refers to the section after the new .data
|
|
||||||
section, make it refer to next one because we have inserted
|
|
||||||
a new section in between. */
|
|
||||||
|
|
||||||
- PATCH_INDEX (NEW_SECTION_H (nn).sh_link);
|
|
||||||
+ PATCH_INDEX (new_shdr->sh_link);
|
|
||||||
/* For symbol tables, info is a symbol table index,
|
|
||||||
so don't change it. */
|
|
||||||
- if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB
|
|
||||||
- && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM)
|
|
||||||
- PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
|
|
||||||
+ if (new_shdr->sh_type != SHT_SYMTAB
|
|
||||||
+ && new_shdr->sh_type != SHT_DYNSYM)
|
|
||||||
+ PATCH_INDEX (new_shdr->sh_info);
|
|
||||||
|
|
||||||
if (old_sbss_index != -1)
|
|
||||||
- if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss"))
|
|
||||||
+ if (!strcmp (old_section_names + new_shdr->sh_name, ".sbss"))
|
|
||||||
{
|
|
||||||
- NEW_SECTION_H (nn).sh_offset =
|
|
||||||
- round_up (NEW_SECTION_H (nn).sh_offset,
|
|
||||||
- NEW_SECTION_H (nn).sh_addralign);
|
|
||||||
- NEW_SECTION_H (nn).sh_type = SHT_PROGBITS;
|
|
||||||
+ new_shdr->sh_offset =
|
|
||||||
+ round_up (new_shdr->sh_offset,
|
|
||||||
+ new_shdr->sh_addralign);
|
|
||||||
+ new_shdr->sh_type = SHT_PROGBITS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now, start to copy the content of sections. */
|
|
||||||
- if (NEW_SECTION_H (nn).sh_type == SHT_NULL
|
|
||||||
- || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
|
|
||||||
+ if (new_shdr->sh_type == SHT_NULL
|
|
||||||
+ || new_shdr->sh_type == SHT_NOBITS)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Write out the sections. .data and .data1 (and data2, called
|
|
||||||
".data" in the strings table) get copied from the current process
|
|
||||||
instead of the old file. */
|
|
||||||
- if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".sdata")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".lit4")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".lit8")
|
|
||||||
+ if (!strcmp (old_section_names + new_shdr->sh_name, ".data")
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".sdata")
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".lit4")
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".lit8")
|
|
||||||
/* The conditional bit below was in Oliva's original code
|
|
||||||
(1999-08-25) and seems to have been dropped by mistake
|
|
||||||
subsequently. It prevents a crash at startup under X in
|
|
||||||
@@ -1044,28 +1045,22 @@ temacs:
|
|
||||||
loader, but I never got anywhere with an SGI support call
|
|
||||||
seeking clues. -- fx 2002-11-29. */
|
|
||||||
#ifdef IRIX6_5
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".got")
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".got")
|
|
||||||
#endif
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".sdata1")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".data1")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".sbss"))
|
|
||||||
- src = (caddr_t) OLD_SECTION_H (n).sh_addr;
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".sdata1")
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".data1")
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".sbss"))
|
|
||||||
+ src = (caddr_t) old_shdr->sh_addr;
|
|
||||||
else
|
|
||||||
- src = old_base + OLD_SECTION_H (n).sh_offset;
|
|
||||||
+ src = old_base + old_shdr->sh_offset;
|
|
||||||
|
|
||||||
- memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
|
|
||||||
- NEW_SECTION_H (nn).sh_size);
|
|
||||||
+ memcpy (new_shdr->sh_offset + new_base, src, new_shdr->sh_size);
|
|
||||||
|
|
||||||
#if defined __alpha__ && !defined __OpenBSD__
|
|
||||||
/* Update Alpha COFF symbol table: */
|
|
||||||
- if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug")
|
|
||||||
- == 0)
|
|
||||||
+ if (strcmp (old_section_names + old_shdr->sh_name, ".mdebug") == 0)
|
|
||||||
{
|
|
||||||
- pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base);
|
|
||||||
+ pHDRR symhdr = (pHDRR) (new_shdr->sh_offset + new_base);
|
|
||||||
|
|
||||||
symhdr->cbLineOffset += new_data2_size;
|
|
||||||
symhdr->cbDnOffset += new_data2_size;
|
|
||||||
@@ -1082,13 +1077,13 @@ temacs:
|
|
||||||
#endif /* __alpha__ && !__OpenBSD__ */
|
|
||||||
|
|
||||||
#if defined (_SYSTYPE_SYSV)
|
|
||||||
- if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG
|
|
||||||
+ if (new_shdr->sh_type == SHT_MIPS_DEBUG
|
|
||||||
&& old_mdebug_index != -1)
|
|
||||||
{
|
|
||||||
- ptrdiff_t new_offset = NEW_SECTION_H (nn).sh_offset;
|
|
||||||
+ ptrdiff_t new_offset = new_shdr->sh_offset;
|
|
||||||
ptrdiff_t old_offset = OLD_SECTION_H (old_mdebug_index).sh_offset;
|
|
||||||
ptrdiff_t diff = new_offset - old_offset;
|
|
||||||
- HDRR *phdr = (HDRR *)(NEW_SECTION_H (nn).sh_offset + new_base);
|
|
||||||
+ HDRR *phdr = (HDRR *) (new_shdr->sh_offset + new_base);
|
|
||||||
|
|
||||||
if (diff)
|
|
||||||
{
|
|
||||||
@@ -1124,8 +1119,8 @@ temacs:
|
|
||||||
n_phdrr->__fileaddr += movement; \
|
|
||||||
}
|
|
||||||
|
|
||||||
- HDRR * o_phdrr = (HDRR *)((byte *)old_base + OLD_SECTION_H (n).sh_offset);
|
|
||||||
- HDRR * n_phdrr = (HDRR *)((byte *)new_base + NEW_SECTION_H (nn).sh_offset);
|
|
||||||
+ HDRR *o_phdrr = (HDRR *) ((byte *) old_base + old_shdr->sh_offset);
|
|
||||||
+ HDRR *n_phdrr = (HDRR *) ((byte *) new_base + new_shdr->sh_offset);
|
|
||||||
unsigned movement = new_data2_size;
|
|
||||||
|
|
||||||
MDEBUGADJUST (idnMax, cbDnOffset);
|
|
||||||
@@ -1142,8 +1137,8 @@ temacs:
|
|
||||||
requires special handling. */
|
|
||||||
if (n_phdrr->cbLine > 0)
|
|
||||||
{
|
|
||||||
- if (o_phdrr->cbLineOffset > (OLD_SECTION_H (n).sh_offset
|
|
||||||
- + OLD_SECTION_H (n).sh_size))
|
|
||||||
+ if (o_phdrr->cbLineOffset > (old_shdr->sh_offset
|
|
||||||
+ + old_shdr->sh_size))
|
|
||||||
{
|
|
||||||
/* line data is in a hole in elf. do special copy and adjust
|
|
||||||
for this ld mistake.
|
|
||||||
@@ -1163,13 +1158,11 @@ temacs:
|
|
||||||
#endif /* __sgi */
|
|
||||||
|
|
||||||
/* If it is the symbol table, its st_shndx field needs to be patched. */
|
|
||||||
- if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB
|
|
||||||
- || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM)
|
|
||||||
+ if (new_shdr->sh_type == SHT_SYMTAB
|
|
||||||
+ || new_shdr->sh_type == SHT_DYNSYM)
|
|
||||||
{
|
|
||||||
- ElfW (Shdr) *spt = &NEW_SECTION_H (nn);
|
|
||||||
- ptrdiff_t num = spt->sh_size / spt->sh_entsize;
|
|
||||||
- ElfW (Sym) * sym = (ElfW (Sym) *) (NEW_SECTION_H (nn).sh_offset +
|
|
||||||
- new_base);
|
|
||||||
+ ptrdiff_t num = new_shdr->sh_size / new_shdr->sh_entsize;
|
|
||||||
+ ElfW (Sym) *sym = (ElfW (Sym) *) (new_shdr->sh_offset + new_base);
|
|
||||||
for (; num--; sym++)
|
|
||||||
{
|
|
||||||
if ((sym->st_shndx == SHN_UNDEF)
|
|
||||||
@@ -1187,15 +1180,16 @@ temacs:
|
|
||||||
{
|
|
||||||
byte *symnames;
|
|
||||||
ElfW (Sym) *symp, *symendp;
|
|
||||||
+ ElfW (Shdr) *sym_shdr = &NEW_SECTION_H (n);
|
|
||||||
|
|
||||||
- if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM
|
|
||||||
- && NEW_SECTION_H (n).sh_type != SHT_SYMTAB)
|
|
||||||
+ if (sym_shdr->sh_type != SHT_DYNSYM
|
|
||||||
+ && sym_shdr->sh_type != SHT_SYMTAB)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
symnames = ((byte *) new_base
|
|
||||||
- + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset);
|
|
||||||
- symp = (ElfW (Sym) *) (NEW_SECTION_H (n).sh_offset + new_base);
|
|
||||||
- symendp = (ElfW (Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
|
|
||||||
+ + NEW_SECTION_H (sym_shdr->sh_link).sh_offset);
|
|
||||||
+ symp = (ElfW (Sym) *) (sym_shdr->sh_offset + new_base);
|
|
||||||
+ symendp = (ElfW (Sym) *) ((byte *) symp + sym_shdr->sh_size);
|
|
||||||
|
|
||||||
for (; symp < symendp; symp ++)
|
|
||||||
{
|
|
||||||
@@ -1219,22 +1213,21 @@ temacs:
|
|
||||||
if (strncmp ((char *) (symnames + symp->st_name),
|
|
||||||
"_OBJC_", sizeof ("_OBJC_") - 1) == 0)
|
|
||||||
{
|
|
||||||
- caddr_t old, new;
|
|
||||||
+ ElfW (Shdr) *new_shdr = &NEW_SECTION_H (symp->st_shndx);
|
|
||||||
+ ptrdiff_t reladdr = symp->st_value - new_shdr->sh_addr;
|
|
||||||
+ ptrdiff_t newoff = reladdr + new_shdr->sh_offset;
|
|
||||||
|
|
||||||
- new = ((symp->st_value - NEW_SECTION_H (symp->st_shndx).sh_addr)
|
|
||||||
- + NEW_SECTION_H (symp->st_shndx).sh_offset + new_base);
|
|
||||||
/* "Unpatch" index. */
|
|
||||||
nn = symp->st_shndx;
|
|
||||||
if (nn > old_bss_index)
|
|
||||||
nn--;
|
|
||||||
if (nn == old_bss_index)
|
|
||||||
- memset (new, 0, symp->st_size);
|
|
||||||
+ memset (new_base + newoff, 0, symp->st_size);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- old = ((symp->st_value
|
|
||||||
- - NEW_SECTION_H (symp->st_shndx).sh_addr)
|
|
||||||
- + OLD_SECTION_H (nn).sh_offset + old_base);
|
|
||||||
- memcpy (new, old, symp->st_size);
|
|
||||||
+ ElfW (Shdr) *old_shdr = &OLD_SECTION_H (nn);
|
|
||||||
+ ptrdiff_t oldoff = reladdr + old_shdr->sh_offset;
|
|
||||||
+ memcpy (new_base + newoff, old_base + oldoff, symp->st_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1245,13 +1238,10 @@ temacs:
|
|
||||||
that it can undo relocations performed by the runtime linker. */
|
|
||||||
for (n = new_file_h->e_shnum; 0 < --n; )
|
|
||||||
{
|
|
||||||
- ElfW (Shdr) section = NEW_SECTION_H (n);
|
|
||||||
-
|
|
||||||
- /* Cause a compilation error if anyone uses n instead of nn below. */
|
|
||||||
- #define n ((void) 0);
|
|
||||||
- n /* Prevent 'macro "n" is not used' warnings. */
|
|
||||||
+ ElfW (Shdr) *rel_shdr = &NEW_SECTION_H (n);
|
|
||||||
+ ElfW (Shdr) *shdr;
|
|
||||||
|
|
||||||
- switch (section.sh_type)
|
|
||||||
+ switch (rel_shdr->sh_type)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
@@ -1260,28 +1250,22 @@ temacs:
|
|
||||||
/* This code handles two different size structs, but there should
|
|
||||||
be no harm in that provided that r_offset is always the first
|
|
||||||
member. */
|
|
||||||
- nn = section.sh_info;
|
|
||||||
- if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".sdata")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".lit4")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".lit8")
|
|
||||||
+ shdr = &NEW_SECTION_H (rel_shdr->sh_info);
|
|
||||||
+ if (!strcmp (old_section_names + shdr->sh_name, ".data")
|
|
||||||
+ || !strcmp (old_section_names + shdr->sh_name, ".sdata")
|
|
||||||
+ || !strcmp (old_section_names + shdr->sh_name, ".lit4")
|
|
||||||
+ || !strcmp (old_section_names + shdr->sh_name, ".lit8")
|
|
||||||
#ifdef IRIX6_5 /* see above */
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".got")
|
|
||||||
+ || !strcmp (old_section_names + shdr->sh_name, ".got")
|
|
||||||
#endif
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".sdata1")
|
|
||||||
- || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
|
|
||||||
- ".data1"))
|
|
||||||
+ || !strcmp (old_section_names + shdr->sh_name, ".sdata1")
|
|
||||||
+ || !strcmp (old_section_names + shdr->sh_name, ".data1"))
|
|
||||||
{
|
|
||||||
- ElfW (Addr) offset = (NEW_SECTION_H (nn).sh_addr
|
|
||||||
- - NEW_SECTION_H (nn).sh_offset);
|
|
||||||
- caddr_t reloc = old_base + section.sh_offset, end;
|
|
||||||
- for (end = reloc + section.sh_size; reloc < end;
|
|
||||||
- reloc += section.sh_entsize)
|
|
||||||
+ ElfW (Addr) offset = shdr->sh_addr - shdr->sh_offset;
|
|
||||||
+ caddr_t reloc = old_base + rel_shdr->sh_offset, end;
|
|
||||||
+ for (end = reloc + rel_shdr->sh_size;
|
|
||||||
+ reloc < end;
|
|
||||||
+ reloc += rel_shdr->sh_entsize)
|
|
||||||
{
|
|
||||||
ElfW (Addr) addr = ((ElfW (Rel) *) reloc)->r_offset - offset;
|
|
||||||
#ifdef __alpha__
|
|
||||||
@@ -1296,8 +1280,6 @@ temacs:
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- #undef n
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write out new_file, and free the buffers. */
|
|
@ -1,174 +0,0 @@
|
|||||||
From 2cb9075979e413e4cc31c85d3bd830f791cc574b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:28:59 -0800
|
|
||||||
Subject: ELF unexec: Merge Alpha and MIPS COFF debug handling
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [3/10]:
|
|
||||||
|
|
||||||
ELF unexec: Merge Alpha and MIPS COFF debug handling
|
|
||||||
|
|
||||||
* unexelf.c (unexec): Merge Alpha and MIPS COFF debug handling.
|
|
||||||
Don't find .mdebug section index, find the section in the loop.
|
|
||||||
Allow for unlikely possibility that .mdebug is located at sh_offset
|
|
||||||
before bss segment, by calculating move from difference in
|
|
||||||
sh_offset rather than just assuming new_data2_size. Simplify
|
|
||||||
cbLineOffset handling.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 47c6e3035b8182c6436de4673473de7824ad59f1
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 96 ++++++++++++++++++-----------------------------------------
|
|
||||||
1 file changed, 29 insertions(+), 67 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index f7465cb..07c2ebe 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -660,9 +660,6 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
ptrdiff_t n, nn;
|
|
||||||
ptrdiff_t old_bss_index, old_sbss_index, old_plt_index;
|
|
||||||
ptrdiff_t old_data_index, new_data2_index;
|
|
||||||
-#if defined _SYSTYPE_SYSV || defined __sgi
|
|
||||||
- ptrdiff_t old_mdebug_index;
|
|
||||||
-#endif
|
|
||||||
struct stat stat_buf;
|
|
||||||
off_t old_file_size;
|
|
||||||
int mask;
|
|
||||||
@@ -707,13 +704,6 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
old_section_names = (char *) old_base
|
|
||||||
+ OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset;
|
|
||||||
|
|
||||||
- /* Find the mdebug section, if any. */
|
|
||||||
-
|
|
||||||
-#if defined _SYSTYPE_SYSV || defined __sgi
|
|
||||||
- old_mdebug_index = find_section (".mdebug", old_section_names,
|
|
||||||
- old_name, old_file_h, old_section_h, 1);
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
/* Find the old .bss section. Figure out parameters of the new
|
|
||||||
data2 and bss sections. */
|
|
||||||
|
|
||||||
@@ -1056,51 +1046,31 @@ temacs:
|
|
||||||
|
|
||||||
memcpy (new_shdr->sh_offset + new_base, src, new_shdr->sh_size);
|
|
||||||
|
|
||||||
-#if defined __alpha__ && !defined __OpenBSD__
|
|
||||||
- /* Update Alpha COFF symbol table: */
|
|
||||||
- if (strcmp (old_section_names + old_shdr->sh_name, ".mdebug") == 0)
|
|
||||||
- {
|
|
||||||
- pHDRR symhdr = (pHDRR) (new_shdr->sh_offset + new_base);
|
|
||||||
-
|
|
||||||
- symhdr->cbLineOffset += new_data2_size;
|
|
||||||
- symhdr->cbDnOffset += new_data2_size;
|
|
||||||
- symhdr->cbPdOffset += new_data2_size;
|
|
||||||
- symhdr->cbSymOffset += new_data2_size;
|
|
||||||
- symhdr->cbOptOffset += new_data2_size;
|
|
||||||
- symhdr->cbAuxOffset += new_data2_size;
|
|
||||||
- symhdr->cbSsOffset += new_data2_size;
|
|
||||||
- symhdr->cbSsExtOffset += new_data2_size;
|
|
||||||
- symhdr->cbFdOffset += new_data2_size;
|
|
||||||
- symhdr->cbRfdOffset += new_data2_size;
|
|
||||||
- symhdr->cbExtOffset += new_data2_size;
|
|
||||||
- }
|
|
||||||
-#endif /* __alpha__ && !__OpenBSD__ */
|
|
||||||
-
|
|
||||||
-#if defined (_SYSTYPE_SYSV)
|
|
||||||
- if (new_shdr->sh_type == SHT_MIPS_DEBUG
|
|
||||||
- && old_mdebug_index != -1)
|
|
||||||
+#if (defined __alpha__ && !defined __OpenBSD__) || defined _SYSTYPE_SYSV
|
|
||||||
+ /* Update Alpha and MIPS COFF debug symbol table. */
|
|
||||||
+ if (strcmp (old_section_names + new_shdr->sh_name, ".mdebug") == 0
|
|
||||||
+ && new_shdr->sh_offset - old_shdr->sh_offset != 0
|
|
||||||
+#if defined _SYSTYPE_SYSV
|
|
||||||
+ && new_shdr->sh_type == SHT_MIPS_DEBUG
|
|
||||||
+#endif
|
|
||||||
+ )
|
|
||||||
{
|
|
||||||
- ptrdiff_t new_offset = new_shdr->sh_offset;
|
|
||||||
- ptrdiff_t old_offset = OLD_SECTION_H (old_mdebug_index).sh_offset;
|
|
||||||
- ptrdiff_t diff = new_offset - old_offset;
|
|
||||||
+ ptrdiff_t diff = new_shdr->sh_offset - old_shdr->sh_offset;
|
|
||||||
HDRR *phdr = (HDRR *) (new_shdr->sh_offset + new_base);
|
|
||||||
|
|
||||||
- if (diff)
|
|
||||||
- {
|
|
||||||
- phdr->cbLineOffset += diff;
|
|
||||||
- phdr->cbDnOffset += diff;
|
|
||||||
- phdr->cbPdOffset += diff;
|
|
||||||
- phdr->cbSymOffset += diff;
|
|
||||||
- phdr->cbOptOffset += diff;
|
|
||||||
- phdr->cbAuxOffset += diff;
|
|
||||||
- phdr->cbSsOffset += diff;
|
|
||||||
- phdr->cbSsExtOffset += diff;
|
|
||||||
- phdr->cbFdOffset += diff;
|
|
||||||
- phdr->cbRfdOffset += diff;
|
|
||||||
- phdr->cbExtOffset += diff;
|
|
||||||
- }
|
|
||||||
+ phdr->cbLineOffset += diff;
|
|
||||||
+ phdr->cbDnOffset += diff;
|
|
||||||
+ phdr->cbPdOffset += diff;
|
|
||||||
+ phdr->cbSymOffset += diff;
|
|
||||||
+ phdr->cbOptOffset += diff;
|
|
||||||
+ phdr->cbAuxOffset += diff;
|
|
||||||
+ phdr->cbSsOffset += diff;
|
|
||||||
+ phdr->cbSsExtOffset += diff;
|
|
||||||
+ phdr->cbFdOffset += diff;
|
|
||||||
+ phdr->cbRfdOffset += diff;
|
|
||||||
+ phdr->cbExtOffset += diff;
|
|
||||||
}
|
|
||||||
-#endif /* _SYSTYPE_SYSV */
|
|
||||||
+#endif /* __alpha__ || _SYSTYPE_SYSV */
|
|
||||||
|
|
||||||
#if __sgi
|
|
||||||
/* Adjust the HDRR offsets in .mdebug and copy the
|
|
||||||
@@ -1111,7 +1081,8 @@ temacs:
|
|
||||||
the ld bug that gets the line table in a hole in the
|
|
||||||
elf file rather than in the .mdebug section proper.
|
|
||||||
David Anderson. davea@sgi.com Jan 16,1994. */
|
|
||||||
- if (n == old_mdebug_index)
|
|
||||||
+ if (strcmp (old_section_names + new_shdr->sh_name, ".mdebug") == 0
|
|
||||||
+ && new_shdr->sh_offset - old_shdr->sh_offset != 0)
|
|
||||||
{
|
|
||||||
#define MDEBUGADJUST(__ct,__fileaddr) \
|
|
||||||
if (n_phdrr->__ct > 0) \
|
|
||||||
@@ -1121,7 +1092,7 @@ temacs:
|
|
||||||
|
|
||||||
HDRR *o_phdrr = (HDRR *) ((byte *) old_base + old_shdr->sh_offset);
|
|
||||||
HDRR *n_phdrr = (HDRR *) ((byte *) new_base + new_shdr->sh_offset);
|
|
||||||
- unsigned movement = new_data2_size;
|
|
||||||
+ ptrdiff_t movement = new_shdr->sh_offset - old_shdr->sh_offset;
|
|
||||||
|
|
||||||
MDEBUGADJUST (idnMax, cbDnOffset);
|
|
||||||
MDEBUGADJUST (ipdMax, cbPdOffset);
|
|
||||||
@@ -1137,22 +1108,13 @@ temacs:
|
|
||||||
requires special handling. */
|
|
||||||
if (n_phdrr->cbLine > 0)
|
|
||||||
{
|
|
||||||
+ n_phdrr->cbLineOffset += movement;
|
|
||||||
+
|
|
||||||
if (o_phdrr->cbLineOffset > (old_shdr->sh_offset
|
|
||||||
+ old_shdr->sh_size))
|
|
||||||
- {
|
|
||||||
- /* line data is in a hole in elf. do special copy and adjust
|
|
||||||
- for this ld mistake.
|
|
||||||
- */
|
|
||||||
- n_phdrr->cbLineOffset += movement;
|
|
||||||
-
|
|
||||||
- memcpy (n_phdrr->cbLineOffset + new_base,
|
|
||||||
- o_phdrr->cbLineOffset + old_base, n_phdrr->cbLine);
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- /* somehow line data is in .mdebug as it is supposed to be. */
|
|
||||||
- MDEBUGADJUST (cbLine, cbLineOffset);
|
|
||||||
- }
|
|
||||||
+ /* If not covered by section, it hasn't yet been copied. */
|
|
||||||
+ memcpy (n_phdrr->cbLineOffset + new_base,
|
|
||||||
+ o_phdrr->cbLineOffset + old_base, n_phdrr->cbLine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* __sgi */
|
|
@ -1,50 +0,0 @@
|
|||||||
From 2776e4ffe1f4cf965a6b99201097ca7d4ee2f95c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:29:00 -0800
|
|
||||||
Subject: ELF unexec: Symbol table patching
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [4/10]:
|
|
||||||
|
|
||||||
ELF unexec: Symbol table patching
|
|
||||||
|
|
||||||
No st_shndx value larger than SHN_LORESERVE should be changed.
|
|
||||||
* unexelf.c (unexec): Don't adjust any st_shndx larger than
|
|
||||||
SHN_LORESERVE. Error on SHN_XINDEX.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 190b968f189cb7d06223bb39045ec9055df67f68
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 9 +++++----
|
|
||||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index 07c2ebe..010ecd3 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -1119,7 +1119,7 @@ temacs:
|
|
||||||
}
|
|
||||||
#endif /* __sgi */
|
|
||||||
|
|
||||||
- /* If it is the symbol table, its st_shndx field needs to be patched. */
|
|
||||||
+ /* Patch st_shndx field of symbol table. */
|
|
||||||
if (new_shdr->sh_type == SHT_SYMTAB
|
|
||||||
|| new_shdr->sh_type == SHT_DYNSYM)
|
|
||||||
{
|
|
||||||
@@ -1127,9 +1127,10 @@ temacs:
|
|
||||||
ElfW (Sym) *sym = (ElfW (Sym) *) (new_shdr->sh_offset + new_base);
|
|
||||||
for (; num--; sym++)
|
|
||||||
{
|
|
||||||
- if ((sym->st_shndx == SHN_UNDEF)
|
|
||||||
- || (sym->st_shndx == SHN_ABS)
|
|
||||||
- || (sym->st_shndx == SHN_COMMON))
|
|
||||||
+ if (sym->st_shndx == SHN_XINDEX)
|
|
||||||
+ fatal ("SHT_SYMTAB_SHNDX unsupported");
|
|
||||||
+ if (sym->st_shndx == SHN_UNDEF
|
|
||||||
+ || sym->st_shndx >= SHN_LORESERVE)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
PATCH_INDEX (sym->st_shndx);
|
|
@ -1,70 +0,0 @@
|
|||||||
From af11708e83ab826202593ab1b9c22601c46a5056 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:29:00 -0800
|
|
||||||
Subject: ELF unexec: _OBJC_ symbols in bss sections
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [5/10]:
|
|
||||||
|
|
||||||
ELF unexec: _OBJC_ symbols in bss sections
|
|
||||||
|
|
||||||
This code assumed that there was only one bss section. Rather than
|
|
||||||
checking for a particular index, check the section type. Also, handle
|
|
||||||
the possibility that the section was SHT_NOBITS originally and is
|
|
||||||
unchanged, in which case no clearing is needed (and sh_offset isn't
|
|
||||||
necessarily valid, which can lead to a wild memset).
|
|
||||||
|
|
||||||
* unexelf.c (unexec): Properly handle _OBJC_ symbols in bss sections.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 3ff9fc0e8d738be5004c65c3be314af9aca68148
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 31 ++++++++++++++++++-------------
|
|
||||||
1 file changed, 18 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index 010ecd3..58f0ad0 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -1177,20 +1177,25 @@ temacs:
|
|
||||||
"_OBJC_", sizeof ("_OBJC_") - 1) == 0)
|
|
||||||
{
|
|
||||||
ElfW (Shdr) *new_shdr = &NEW_SECTION_H (symp->st_shndx);
|
|
||||||
- ptrdiff_t reladdr = symp->st_value - new_shdr->sh_addr;
|
|
||||||
- ptrdiff_t newoff = reladdr + new_shdr->sh_offset;
|
|
||||||
-
|
|
||||||
- /* "Unpatch" index. */
|
|
||||||
- nn = symp->st_shndx;
|
|
||||||
- if (nn > old_bss_index)
|
|
||||||
- nn--;
|
|
||||||
- if (nn == old_bss_index)
|
|
||||||
- memset (new_base + newoff, 0, symp->st_size);
|
|
||||||
- else
|
|
||||||
+ if (new_shdr->sh_type != SHT_NOBITS)
|
|
||||||
{
|
|
||||||
- ElfW (Shdr) *old_shdr = &OLD_SECTION_H (nn);
|
|
||||||
- ptrdiff_t oldoff = reladdr + old_shdr->sh_offset;
|
|
||||||
- memcpy (new_base + newoff, old_base + oldoff, symp->st_size);
|
|
||||||
+ ElfW (Shdr) *old_shdr;
|
|
||||||
+ ptrdiff_t reladdr = symp->st_value - new_shdr->sh_addr;
|
|
||||||
+ ptrdiff_t newoff = reladdr + new_shdr->sh_offset;
|
|
||||||
+
|
|
||||||
+ /* "Unpatch" index. */
|
|
||||||
+ nn = symp->st_shndx;
|
|
||||||
+ if (nn > old_bss_index)
|
|
||||||
+ nn--;
|
|
||||||
+ old_shdr = &OLD_SECTION_H (nn);
|
|
||||||
+ if (old_shdr->sh_type == SHT_NOBITS)
|
|
||||||
+ memset (new_base + newoff, 0, symp->st_size);
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ ptrdiff_t oldoff = reladdr + old_shdr->sh_offset;
|
|
||||||
+ memcpy (new_base + newoff, old_base + oldoff,
|
|
||||||
+ symp->st_size);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -1,58 +0,0 @@
|
|||||||
From f9d91515971443b754b9c9eaac45a293d0e620c1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:29:00 -0800
|
|
||||||
Subject: ELF unexec: R_*_NONE relocs
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [6/10]:
|
|
||||||
|
|
||||||
ELF unexec: R_*_NONE relocs
|
|
||||||
|
|
||||||
These should be ignored on all targets.
|
|
||||||
|
|
||||||
* unexelf.c (unexec): Ignore R_*_NONE relocs for any target,
|
|
||||||
not just Alpha. Comment on reloc size assumption.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 8285c2ab8050de218c0c06182659ee0a7b23a0f6
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 14 +++++++-------
|
|
||||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index 58f0ad0..1d9387e 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -1203,7 +1203,7 @@ temacs:
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This loop seeks out relocation sections for the data section, so
|
|
||||||
- that it can undo relocations performed by the runtime linker. */
|
|
||||||
+ that it can undo relocations performed by the runtime loader. */
|
|
||||||
for (n = new_file_h->e_shnum; 0 < --n; )
|
|
||||||
{
|
|
||||||
ElfW (Shdr) *rel_shdr = &NEW_SECTION_H (n);
|
|
||||||
@@ -1236,14 +1236,14 @@ temacs:
|
|
||||||
reloc += rel_shdr->sh_entsize)
|
|
||||||
{
|
|
||||||
ElfW (Addr) addr = ((ElfW (Rel) *) reloc)->r_offset - offset;
|
|
||||||
-#ifdef __alpha__
|
|
||||||
- /* The Alpha ELF binutils currently have a bug that
|
|
||||||
- sometimes results in relocs that contain all
|
|
||||||
- zeroes. Work around this for now... */
|
|
||||||
+ /* Ignore R_*_NONE relocs. */
|
|
||||||
if (((ElfW (Rel) *) reloc)->r_offset == 0)
|
|
||||||
continue;
|
|
||||||
-#endif
|
|
||||||
- memcpy (new_base + addr, old_base + addr, sizeof (ElfW (Addr)));
|
|
||||||
+ /* Assume reloc applies to a word.
|
|
||||||
+ ??? This is not always true, eg. TLS module/index
|
|
||||||
+ pair in .got which occupies two words. */
|
|
||||||
+ memcpy (new_base + addr, old_base + addr,
|
|
||||||
+ sizeof (ElfW (Addr)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
@ -1,480 +0,0 @@
|
|||||||
From 75dc7e12d73ad8c1bf9583515e41913980883dbe Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:29:00 -0800
|
|
||||||
Subject: ELF unexec: Drive from PT_LOAD header rather than sections
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [7/10]:
|
|
||||||
|
|
||||||
ELF unexec: Drive from PT_LOAD header rather than sections
|
|
||||||
|
|
||||||
This rewrites bss handling in the ELF unexec code. Finding bss
|
|
||||||
sections by name results in complicated code that
|
|
||||||
- does not account for all names of possible bss sections,
|
|
||||||
- assumes specific ordering of bss sections,
|
|
||||||
- can wrongly choose a SHT_NOBITS section not in the bss segment,
|
|
||||||
- incorrectly calculates bss size (no accounting for alignment gaps),
|
|
||||||
- assumes .data and .bss are in the same segment.
|
|
||||||
|
|
||||||
All of these problems and more are solved by finding the bss segment
|
|
||||||
in PT_LOAD headers, ie. the address range included in p_memsz but not
|
|
||||||
p_filesz of the last PT_LOAD header, then matching SHT_NOBITS sections
|
|
||||||
in that address range.
|
|
||||||
|
|
||||||
* unexelf.c: Delete old ppc comment.
|
|
||||||
(OLD_PROGRAM_H): Define.
|
|
||||||
(round_up): Delete.
|
|
||||||
(unexec): Don't search for bss style sections by name. Instead,
|
|
||||||
use the last PT_LOAD header address range covered by p_memsz
|
|
||||||
but not p_filesz and match any SHT_NOBITS section in that
|
|
||||||
address range. Simplify initialisation of section header vars.
|
|
||||||
Don't assume that section headers are above bss segment. Move
|
|
||||||
copying of bss area out of section loop. Align .data2 section
|
|
||||||
to 1, since it now covers the entire bss area. For SHT_NOBITS
|
|
||||||
sections in the bss segment, leave sh_addr and sh_addralign
|
|
||||||
unchanged, but correct sh_offset. Clear memory corresponding
|
|
||||||
to SHT_NOBITS .plt section. Delete comment and hacks for
|
|
||||||
sections partly overlapping bss range now that the full range
|
|
||||||
is properly calculated. Delete now dead .sbss code.
|
|
||||||
(Bug#20614)
|
|
||||||
|
|
||||||
Origin: upstream, commit: 0d6442265e5b709af5eebedf8f0d6b82974f4c31
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 290 ++++++++++++++++------------------------------------------
|
|
||||||
1 file changed, 77 insertions(+), 213 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index 1d9387e..c659f3e 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -535,29 +535,6 @@ verify ((! TYPE_SIGNED (ElfW (Half))
|
|
||||||
/* Get the address of a particular section or program header entry,
|
|
||||||
* accounting for the size of the entries.
|
|
||||||
*/
|
|
||||||
-/*
|
|
||||||
- On PPC Reference Platform running Solaris 2.5.1
|
|
||||||
- the plt section is also of type NOBI like the bss section.
|
|
||||||
- (not really stored) and therefore sections after the bss
|
|
||||||
- section start at the plt offset. The plt section is always
|
|
||||||
- the one just before the bss section.
|
|
||||||
- Thus, we modify the test from
|
|
||||||
- if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
|
|
||||||
- to
|
|
||||||
- if (NEW_SECTION_H (nn).sh_offset >=
|
|
||||||
- OLD_SECTION_H (old_bss_index-1).sh_offset)
|
|
||||||
- This is just a hack. We should put the new data section
|
|
||||||
- before the .plt section.
|
|
||||||
- And we should not have this routine at all but use
|
|
||||||
- the libelf library to read the old file and create the new
|
|
||||||
- file.
|
|
||||||
- The changed code is minimal and depends on prep set in m/prep.h
|
|
||||||
- Erik Deumens
|
|
||||||
- Quantum Theory Project
|
|
||||||
- University of Florida
|
|
||||||
- deumens@qtp.ufl.edu
|
|
||||||
- Apr 23, 1996
|
|
||||||
- */
|
|
||||||
|
|
||||||
static void *
|
|
||||||
entry_address (void *section_h, ptrdiff_t idx, ptrdiff_t entsize)
|
|
||||||
@@ -570,23 +547,14 @@ entry_address (void *section_h, ptrdiff_t idx, ptrdiff_t entsize)
|
|
||||||
(*(ElfW (Shdr) *) entry_address (old_section_h, n, old_file_h->e_shentsize))
|
|
||||||
#define NEW_SECTION_H(n) \
|
|
||||||
(*(ElfW (Shdr) *) entry_address (new_section_h, n, new_file_h->e_shentsize))
|
|
||||||
+#define OLD_PROGRAM_H(n) \
|
|
||||||
+ (*(ElfW (Phdr) *) entry_address (old_program_h, n, old_file_h->e_phentsize))
|
|
||||||
#define NEW_PROGRAM_H(n) \
|
|
||||||
(*(ElfW (Phdr) *) entry_address (new_program_h, n, new_file_h->e_phentsize))
|
|
||||||
|
|
||||||
#define PATCH_INDEX(n) ((n) += old_bss_index <= (n))
|
|
||||||
typedef unsigned char byte;
|
|
||||||
|
|
||||||
-/* Round X up to a multiple of Y. */
|
|
||||||
-
|
|
||||||
-static ElfW (Addr)
|
|
||||||
-round_up (ElfW (Addr) x, ElfW (Addr) y)
|
|
||||||
-{
|
|
||||||
- ElfW (Addr) rem = x % y;
|
|
||||||
- if (rem == 0)
|
|
||||||
- return x;
|
|
||||||
- return x - rem + y;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
/* Return the index of the section named NAME.
|
|
||||||
SECTION_NAMES, FILE_NAME and FILE_H give information
|
|
||||||
about the file we are looking in.
|
|
||||||
@@ -650,16 +618,15 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
/* Point to the section name table in the old file. */
|
|
||||||
char *old_section_names;
|
|
||||||
|
|
||||||
+ ElfW (Phdr) *old_bss_seg, *new_bss_seg;
|
|
||||||
ElfW (Addr) old_bss_addr, new_bss_addr;
|
|
||||||
ElfW (Word) old_bss_size, new_data2_size;
|
|
||||||
ElfW (Off) new_data2_offset;
|
|
||||||
ElfW (Addr) new_data2_addr;
|
|
||||||
ElfW (Off) old_bss_offset;
|
|
||||||
- ElfW (Word) new_data2_incr;
|
|
||||||
|
|
||||||
ptrdiff_t n, nn;
|
|
||||||
- ptrdiff_t old_bss_index, old_sbss_index, old_plt_index;
|
|
||||||
- ptrdiff_t old_data_index, new_data2_index;
|
|
||||||
+ ptrdiff_t old_bss_index, old_data_index;
|
|
||||||
struct stat stat_buf;
|
|
||||||
off_t old_file_size;
|
|
||||||
int mask;
|
|
||||||
@@ -704,54 +671,40 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
old_section_names = (char *) old_base
|
|
||||||
+ OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset;
|
|
||||||
|
|
||||||
- /* Find the old .bss section. Figure out parameters of the new
|
|
||||||
- data2 and bss sections. */
|
|
||||||
-
|
|
||||||
- old_bss_index = find_section (".bss", old_section_names,
|
|
||||||
- old_name, old_file_h, old_section_h, 0);
|
|
||||||
-
|
|
||||||
- old_sbss_index = find_section (".sbss", old_section_names,
|
|
||||||
- old_name, old_file_h, old_section_h, 1);
|
|
||||||
- if (old_sbss_index != -1)
|
|
||||||
- if (OLD_SECTION_H (old_sbss_index).sh_type != SHT_NOBITS)
|
|
||||||
- old_sbss_index = -1;
|
|
||||||
-
|
|
||||||
- /* PowerPC64 has .plt in the BSS section. */
|
|
||||||
- old_plt_index = find_section (".plt", old_section_names,
|
|
||||||
- old_name, old_file_h, old_section_h, 1);
|
|
||||||
- if (old_plt_index != -1)
|
|
||||||
- if (OLD_SECTION_H (old_plt_index).sh_type != SHT_NOBITS)
|
|
||||||
- old_plt_index = -1;
|
|
||||||
-
|
|
||||||
- if (old_sbss_index == -1 && old_plt_index == -1)
|
|
||||||
- {
|
|
||||||
- old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
|
|
||||||
- old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
|
|
||||||
- old_bss_offset = OLD_SECTION_H (old_bss_index).sh_offset;
|
|
||||||
- new_data2_index = old_bss_index;
|
|
||||||
- }
|
|
||||||
- else if (old_plt_index != -1
|
|
||||||
- && (old_sbss_index == -1
|
|
||||||
- || (OLD_SECTION_H (old_sbss_index).sh_addr
|
|
||||||
- > OLD_SECTION_H (old_plt_index).sh_addr)))
|
|
||||||
+ /* Find the PT_LOAD header covering the highest address. This
|
|
||||||
+ segment will be where bss sections are located, past p_filesz. */
|
|
||||||
+ old_bss_seg = 0;
|
|
||||||
+ for (n = old_file_h->e_phnum; --n >= 0; )
|
|
||||||
{
|
|
||||||
- old_bss_addr = OLD_SECTION_H (old_plt_index).sh_addr;
|
|
||||||
- old_bss_size = OLD_SECTION_H (old_bss_index).sh_size
|
|
||||||
- + OLD_SECTION_H (old_plt_index).sh_size;
|
|
||||||
- if (old_sbss_index != -1)
|
|
||||||
- old_bss_size += OLD_SECTION_H (old_sbss_index).sh_size;
|
|
||||||
- old_bss_offset = OLD_SECTION_H (old_plt_index).sh_offset;
|
|
||||||
- new_data2_index = old_plt_index;
|
|
||||||
+ ElfW (Phdr) *seg = &OLD_PROGRAM_H (n);
|
|
||||||
+ if (seg->p_type == PT_LOAD
|
|
||||||
+ && (old_bss_seg == 0
|
|
||||||
+ || seg->p_vaddr > old_bss_seg->p_vaddr))
|
|
||||||
+ old_bss_seg = seg;
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+
|
|
||||||
+ /* Note that old_bss_addr may be lower than the first bss section
|
|
||||||
+ address, since the section may need aligning. */
|
|
||||||
+ old_bss_addr = old_bss_seg->p_vaddr + old_bss_seg->p_filesz;
|
|
||||||
+ old_bss_offset = old_bss_seg->p_offset + old_bss_seg->p_filesz;
|
|
||||||
+ old_bss_size = old_bss_seg->p_memsz - old_bss_seg->p_filesz;
|
|
||||||
+
|
|
||||||
+ /* Find the first bss style section in the bss segment range. */
|
|
||||||
+ old_bss_index = -1;
|
|
||||||
+ for (n = old_file_h->e_shnum; --n > 0; )
|
|
||||||
{
|
|
||||||
- old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr;
|
|
||||||
- old_bss_size = OLD_SECTION_H (old_bss_index).sh_size
|
|
||||||
- + OLD_SECTION_H (old_sbss_index).sh_size;
|
|
||||||
- old_bss_offset = OLD_SECTION_H (old_sbss_index).sh_offset;
|
|
||||||
- new_data2_index = old_sbss_index;
|
|
||||||
+ ElfW (Shdr) *shdr = &OLD_SECTION_H (n);
|
|
||||||
+ if (shdr->sh_type == SHT_NOBITS
|
|
||||||
+ && shdr->sh_addr >= old_bss_addr
|
|
||||||
+ && shdr->sh_addr + shdr->sh_size <= old_bss_addr + old_bss_size
|
|
||||||
+ && (old_bss_index == -1
|
|
||||||
+ || OLD_SECTION_H (old_bss_index).sh_addr > shdr->sh_addr))
|
|
||||||
+ old_bss_index = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (old_bss_index == -1)
|
|
||||||
+ fatal ("no bss section found");
|
|
||||||
+
|
|
||||||
/* Find the old .data section. Figure out parameters of
|
|
||||||
the new data2 and bss sections. */
|
|
||||||
|
|
||||||
@@ -762,13 +715,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
new_bss_addr = (ElfW (Addr)) new_break;
|
|
||||||
new_data2_addr = old_bss_addr;
|
|
||||||
new_data2_size = new_bss_addr - old_bss_addr;
|
|
||||||
- new_data2_offset = OLD_SECTION_H (old_data_index).sh_offset
|
|
||||||
- + (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr);
|
|
||||||
- /* This is the amount by which the sections following the bss sections
|
|
||||||
- must be shifted in the image. It can differ from new_data2_size if
|
|
||||||
- the end of the old .data section (and thus the offset of the .bss
|
|
||||||
- section) was unaligned. */
|
|
||||||
- new_data2_incr = new_data2_size + (new_data2_offset - old_bss_offset);
|
|
||||||
+ new_data2_offset = old_bss_offset;
|
|
||||||
|
|
||||||
#ifdef UNEXELF_DEBUG
|
|
||||||
fprintf (stderr, "old_bss_index %td\n", old_bss_index);
|
|
||||||
@@ -779,7 +726,6 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
DEBUG_LOG (new_data2_addr);
|
|
||||||
DEBUG_LOG (new_data2_size);
|
|
||||||
DEBUG_LOG (new_data2_offset);
|
|
||||||
- DEBUG_LOG (new_data2_incr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (new_bss_addr < old_bss_addr + old_bss_size)
|
|
||||||
@@ -793,7 +739,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
if (new_file < 0)
|
|
||||||
fatal ("Can't creat (%s): %s", new_name, strerror (errno));
|
|
||||||
|
|
||||||
- new_file_size = old_file_size + old_file_h->e_shentsize + new_data2_incr;
|
|
||||||
+ new_file_size = old_file_size + old_file_h->e_shentsize + new_data2_size;
|
|
||||||
|
|
||||||
if (ftruncate (new_file, new_file_size))
|
|
||||||
fatal ("Can't ftruncate (%s): %s", new_name, strerror (errno));
|
|
||||||
@@ -812,15 +758,15 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
/* Fix up file header. We'll add one section. Section header is
|
|
||||||
further away now. */
|
|
||||||
|
|
||||||
- new_file_h->e_shoff += new_data2_incr;
|
|
||||||
+ if (new_file_h->e_shoff >= old_bss_offset)
|
|
||||||
+ new_file_h->e_shoff += new_data2_size;
|
|
||||||
new_file_h->e_shnum += 1;
|
|
||||||
|
|
||||||
/* Modify the e_shstrndx if necessary. */
|
|
||||||
PATCH_INDEX (new_file_h->e_shstrndx);
|
|
||||||
|
|
||||||
- new_program_h = (ElfW (Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
|
|
||||||
- new_section_h = (ElfW (Shdr) *)
|
|
||||||
- ((byte *) new_base + old_file_h->e_shoff + new_data2_incr);
|
|
||||||
+ new_program_h = (ElfW (Phdr) *) ((byte *) new_base + new_file_h->e_phoff);
|
|
||||||
+ new_section_h = (ElfW (Shdr) *) ((byte *) new_base + new_file_h->e_shoff);
|
|
||||||
|
|
||||||
memcpy (new_program_h, old_program_h,
|
|
||||||
old_file_h->e_phnum * old_file_h->e_phentsize);
|
|
||||||
@@ -832,65 +778,21 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
fprintf (stderr, "New section count %td\n", (ptrdiff_t) new_file_h->e_shnum);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
- /* Fix up a new program header. Extend the writable data segment so
|
|
||||||
- that the bss area is covered too. Find that segment by looking
|
|
||||||
- for a segment that ends just before the .bss area. Make sure
|
|
||||||
- that no segments are above the new .data2. Put a loop at the end
|
|
||||||
- to adjust the offset and address of any segment that is above
|
|
||||||
- data2, just in case we decide to allow this later. */
|
|
||||||
+ /* Fix up program header. Extend the writable data segment so
|
|
||||||
+ that the bss area is covered too. */
|
|
||||||
|
|
||||||
- for (n = new_file_h->e_phnum; --n >= 0; )
|
|
||||||
- {
|
|
||||||
- /* Compute maximum of all requirements for alignment of section. */
|
|
||||||
- ElfW (Word) alignment = (NEW_PROGRAM_H (n)).p_align;
|
|
||||||
- if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment)
|
|
||||||
- alignment = OLD_SECTION_H (old_bss_index).sh_addralign;
|
|
||||||
-
|
|
||||||
-#ifdef __sgi
|
|
||||||
- /* According to r02kar@x4u2.desy.de (Karsten Kuenne)
|
|
||||||
- and oliva@gnu.org (Alexandre Oliva), on IRIX 5.2, we
|
|
||||||
- always get "Program segment above .bss" when dumping
|
|
||||||
- when the executable doesn't have an sbss section. */
|
|
||||||
- if (old_sbss_index != -1)
|
|
||||||
-#endif /* __sgi */
|
|
||||||
- if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz
|
|
||||||
- > (old_sbss_index == -1
|
|
||||||
- ? old_bss_addr
|
|
||||||
- : round_up (old_bss_addr, alignment)))
|
|
||||||
- fatal ("Program segment above .bss in %s", old_name);
|
|
||||||
-
|
|
||||||
- if (NEW_PROGRAM_H (n).p_type == PT_LOAD
|
|
||||||
- && (round_up ((NEW_PROGRAM_H (n)).p_vaddr
|
|
||||||
- + (NEW_PROGRAM_H (n)).p_filesz,
|
|
||||||
- alignment)
|
|
||||||
- == round_up (old_bss_addr, alignment)))
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- if (n < 0)
|
|
||||||
- fatal ("Couldn't find segment next to .bss in %s", old_name);
|
|
||||||
-
|
|
||||||
- /* Make sure that the size includes any padding before the old .bss
|
|
||||||
- section. */
|
|
||||||
- NEW_PROGRAM_H (n).p_filesz = new_bss_addr - NEW_PROGRAM_H (n).p_vaddr;
|
|
||||||
- NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz;
|
|
||||||
-
|
|
||||||
-#if 0 /* Maybe allow section after data2 - does this ever happen? */
|
|
||||||
- for (n = new_file_h->e_phnum; --n >= 0; )
|
|
||||||
- {
|
|
||||||
- if (NEW_PROGRAM_H (n).p_vaddr
|
|
||||||
- && NEW_PROGRAM_H (n).p_vaddr >= new_data2_addr)
|
|
||||||
- NEW_PROGRAM_H (n).p_vaddr += new_data2_size - old_bss_size;
|
|
||||||
+ new_bss_seg = new_program_h + (old_bss_seg - old_program_h);
|
|
||||||
+ new_bss_seg->p_filesz = new_bss_addr - new_bss_seg->p_vaddr;
|
|
||||||
+ new_bss_seg->p_memsz = new_bss_seg->p_filesz;
|
|
||||||
|
|
||||||
- if (NEW_PROGRAM_H (n).p_offset >= new_data2_offset)
|
|
||||||
- NEW_PROGRAM_H (n).p_offset += new_data2_incr;
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
+ /* Copy over what we have in memory now for the bss area. */
|
|
||||||
+ memcpy (new_base + new_data2_offset, (caddr_t) old_bss_addr, new_data2_size);
|
|
||||||
|
|
||||||
/* Fix up section headers based on new .data2 section. Any section
|
|
||||||
whose offset or virtual address is after the new .data2 section
|
|
||||||
- gets its value adjusted. .bss size becomes zero and new address
|
|
||||||
- is set. data2 section header gets added by copying the existing
|
|
||||||
- .data header and modifying the offset, address and size. */
|
|
||||||
+ gets its value adjusted. .bss size becomes zero. data2 section
|
|
||||||
+ header gets added by copying the existing .data header and
|
|
||||||
+ modifying the offset, address and size. */
|
|
||||||
|
|
||||||
/* Walk through all section headers, insert the new data2 section right
|
|
||||||
before the new bss section. */
|
|
||||||
@@ -901,9 +803,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
ElfW (Shdr) *new_shdr = &NEW_SECTION_H (nn);
|
|
||||||
|
|
||||||
/* If it is (s)bss section, insert the new data2 section before it. */
|
|
||||||
- /* new_data2_index is the index of either old_sbss or old_bss, that was
|
|
||||||
- chosen as a section for new_data2. */
|
|
||||||
- if (n == new_data2_index)
|
|
||||||
+ if (n == old_bss_index)
|
|
||||||
{
|
|
||||||
/* Steal the data section header for this data2 section. */
|
|
||||||
memcpy (new_shdr, &OLD_SECTION_H (old_data_index),
|
|
||||||
@@ -912,68 +812,43 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
new_shdr->sh_addr = new_data2_addr;
|
|
||||||
new_shdr->sh_offset = new_data2_offset;
|
|
||||||
new_shdr->sh_size = new_data2_size;
|
|
||||||
- /* Use the bss section's alignment. This will assure that the
|
|
||||||
- new data2 section always be placed in the same spot as the old
|
|
||||||
- bss section by any other application. */
|
|
||||||
- new_shdr->sh_addralign = old_shdr->sh_addralign;
|
|
||||||
-
|
|
||||||
- /* Now copy over what we have in the memory now. */
|
|
||||||
- memcpy (new_shdr->sh_offset + new_base,
|
|
||||||
- (caddr_t) old_shdr->sh_addr,
|
|
||||||
- new_data2_size);
|
|
||||||
+ new_shdr->sh_addralign = 1;
|
|
||||||
nn++;
|
|
||||||
new_shdr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy (new_shdr, old_shdr, old_file_h->e_shentsize);
|
|
||||||
|
|
||||||
- if (n == old_bss_index
|
|
||||||
- /* The new bss and sbss section's size is zero, and its file offset
|
|
||||||
- and virtual address should be off by NEW_DATA2_SIZE. */
|
|
||||||
- || n == old_sbss_index || n == old_plt_index
|
|
||||||
- )
|
|
||||||
+ if (new_shdr->sh_type == SHT_NOBITS
|
|
||||||
+ && new_shdr->sh_addr >= old_bss_addr
|
|
||||||
+ && (new_shdr->sh_addr + new_shdr->sh_size
|
|
||||||
+ <= old_bss_addr + old_bss_size))
|
|
||||||
{
|
|
||||||
- /* NN should be `old_s?bss_index + 1' at this point. */
|
|
||||||
- new_shdr->sh_offset = new_data2_offset + new_data2_size;
|
|
||||||
- new_shdr->sh_addr = new_data2_addr + new_data2_size;
|
|
||||||
- /* Let the new bss section address alignment be the same as the
|
|
||||||
- section address alignment followed the old bss section, so
|
|
||||||
- this section will be placed in exactly the same place. */
|
|
||||||
- new_shdr->sh_addralign = OLD_SECTION_H (nn).sh_addralign;
|
|
||||||
+ /* SHT_NOBITS sections do not need a valid sh_offset, so it
|
|
||||||
+ might be incorrect. Write the correct value. */
|
|
||||||
+ new_shdr->sh_offset = (new_shdr->sh_addr - new_bss_seg->p_vaddr
|
|
||||||
+ + new_bss_seg->p_offset);
|
|
||||||
+
|
|
||||||
+ /* If this is was a SHT_NOBITS .plt section, then it is
|
|
||||||
+ probably a PowerPC PLT. If it is PowerPC64 ELFv1 then
|
|
||||||
+ glibc ld.so doesn't initialize the toc pointer word. A
|
|
||||||
+ non-zero toc pointer word can defeat Power7 thread safety
|
|
||||||
+ during lazy update of a PLT entry. This only matters if
|
|
||||||
+ emacs becomes multi-threaded. */
|
|
||||||
+ if (strcmp (old_section_names + new_shdr->sh_name, ".plt") == 0)
|
|
||||||
+ memset (new_shdr->sh_offset + new_base, 0, new_shdr->sh_size);
|
|
||||||
+
|
|
||||||
+ /* Set the new bss and sbss section's size to zero, because
|
|
||||||
+ we've already covered this address range by .data2. */
|
|
||||||
new_shdr->sh_size = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Any section that was originally placed after the .bss
|
|
||||||
- section should now be off by NEW_DATA2_INCR. If a
|
|
||||||
- section overlaps the .bss section, consider it to be
|
|
||||||
- placed after the .bss section. Overlap can occur if the
|
|
||||||
- section just before .bss has less-strict alignment; this
|
|
||||||
- was observed between .symtab and .bss on Solaris 2.5.1
|
|
||||||
- (sparc) with GCC snapshot 960602.
|
|
||||||
+ section should now be off by NEW_DATA2_SIZE. */
|
|
||||||
|
|
||||||
-> dump -h temacs
|
|
||||||
-
|
|
||||||
-temacs:
|
|
||||||
-
|
|
||||||
- **** SECTION HEADER TABLE ****
|
|
||||||
-[No] Type Flags Addr Offset Size Name
|
|
||||||
- Link Info Adralgn Entsize
|
|
||||||
-
|
|
||||||
-[22] 1 3 0x335150 0x315150 0x4 .data.rel.local
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
-[23] 8 3 0x335158 0x315158 0x42720 .bss
|
|
||||||
- 0 0 0x8 0
|
|
||||||
-
|
|
||||||
-[24] 2 0 0 0x315154 0x1c9d0 .symtab
|
|
||||||
- 25 1709 0x4 0x10
|
|
||||||
- */
|
|
||||||
-
|
|
||||||
- if (new_shdr->sh_offset >= old_bss_offset
|
|
||||||
- || (new_shdr->sh_offset + new_shdr->sh_size
|
|
||||||
- > new_data2_offset))
|
|
||||||
- new_shdr->sh_offset += new_data2_incr;
|
|
||||||
+ if (new_shdr->sh_offset >= old_bss_offset)
|
|
||||||
+ new_shdr->sh_offset += new_data2_size;
|
|
||||||
|
|
||||||
/* Any section that was originally placed after the section
|
|
||||||
header table should now be off by the size of one section
|
|
||||||
@@ -993,23 +868,13 @@ temacs:
|
|
||||||
&& new_shdr->sh_type != SHT_DYNSYM)
|
|
||||||
PATCH_INDEX (new_shdr->sh_info);
|
|
||||||
|
|
||||||
- if (old_sbss_index != -1)
|
|
||||||
- if (!strcmp (old_section_names + new_shdr->sh_name, ".sbss"))
|
|
||||||
- {
|
|
||||||
- new_shdr->sh_offset =
|
|
||||||
- round_up (new_shdr->sh_offset,
|
|
||||||
- new_shdr->sh_addralign);
|
|
||||||
- new_shdr->sh_type = SHT_PROGBITS;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
/* Now, start to copy the content of sections. */
|
|
||||||
if (new_shdr->sh_type == SHT_NULL
|
|
||||||
|| new_shdr->sh_type == SHT_NOBITS)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
- /* Write out the sections. .data and .data1 (and data2, called
|
|
||||||
- ".data" in the strings table) get copied from the current process
|
|
||||||
- instead of the old file. */
|
|
||||||
+ /* Some sections are copied from the current process instead of
|
|
||||||
+ the old file. */
|
|
||||||
if (!strcmp (old_section_names + new_shdr->sh_name, ".data")
|
|
||||||
|| !strcmp (old_section_names + new_shdr->sh_name, ".sdata")
|
|
||||||
|| !strcmp (old_section_names + new_shdr->sh_name, ".lit4")
|
|
||||||
@@ -1038,8 +903,7 @@ temacs:
|
|
||||||
|| !strcmp (old_section_names + new_shdr->sh_name, ".got")
|
|
||||||
#endif
|
|
||||||
|| !strcmp (old_section_names + new_shdr->sh_name, ".sdata1")
|
|
||||||
- || !strcmp (old_section_names + new_shdr->sh_name, ".data1")
|
|
||||||
- || !strcmp (old_section_names + new_shdr->sh_name, ".sbss"))
|
|
||||||
+ || !strcmp (old_section_names + new_shdr->sh_name, ".data1"))
|
|
||||||
src = (caddr_t) old_shdr->sh_addr;
|
|
||||||
else
|
|
||||||
src = old_base + old_shdr->sh_offset;
|
|
@ -1,705 +0,0 @@
|
|||||||
From ee3beb72e75cdffa08b99e2f9d4829665feccb18 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Modra <amodra@gmail.com>
|
|
||||||
Date: Sun, 8 Nov 2015 09:29:00 -0800
|
|
||||||
Subject: ELF unexec: Don't insert a new section
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [8/10]:
|
|
||||||
|
|
||||||
ELF unexec: Don't insert a new section
|
|
||||||
|
|
||||||
Reuse the .bss section instead, making it SHT_PROGBITS. This way we
|
|
||||||
don't need to mess with symbol st_shndx, or section sh_link and
|
|
||||||
sh_info.
|
|
||||||
|
|
||||||
This does lead to eu-elflint complaints about symbols defined in .bss
|
|
||||||
with a needed version, because normally it is undefined symbols that
|
|
||||||
have needed versions; Defined symbols have version definitions.
|
|
||||||
The exception is symbols defined by the linker in .dynbss for
|
|
||||||
variables copied from a shared library in order to avoid text
|
|
||||||
relocations, with copy relocs to copy their initial values from the
|
|
||||||
shared library. These symbols are both defined and have needed
|
|
||||||
versions, and eu-elflink only expects to see them in SHT_NOBITS
|
|
||||||
sections. Of course there is no real problem with having such symbols
|
|
||||||
in SHT_PROGBITS sections. glibc ld.so handles them fine.
|
|
||||||
|
|
||||||
* unexelf.c: Delete outdated comments.
|
|
||||||
(PATCH_INDEX): Delete.
|
|
||||||
(find_section): Delete.
|
|
||||||
(unexec): Don't add a new section. Instead reuse the last bss
|
|
||||||
section, extending it to cover dumped data. Make bss sections
|
|
||||||
SHT_PROGBITS. Remove all patching of sh_link, sh_info and
|
|
||||||
st_shndx. Rename bss sections.
|
|
||||||
|
|
||||||
Origin: upstream, commit: 3008c521740c5ad46a4eaf343b438b02c25e4de5
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 524 ++++++----------------------------------------------------
|
|
||||||
1 file changed, 50 insertions(+), 474 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index c659f3e..9279c76 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -40,347 +40,6 @@ what you give them. Help stamp out software-hoarding! */
|
|
||||||
* On some machines, an existing old_name file is required.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
-
|
|
||||||
-/* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co.
|
|
||||||
- * ELF support added.
|
|
||||||
- *
|
|
||||||
- * Basic theory: the data space of the running process needs to be
|
|
||||||
- * dumped to the output file. Normally we would just enlarge the size
|
|
||||||
- * of .data, scooting everything down. But we can't do that in ELF,
|
|
||||||
- * because there is often something between the .data space and the
|
|
||||||
- * .bss space.
|
|
||||||
- *
|
|
||||||
- * In the temacs dump below, notice that the Global Offset Table
|
|
||||||
- * (.got) and the Dynamic link data (.dynamic) come between .data1 and
|
|
||||||
- * .bss. It does not work to overlap .data with these fields.
|
|
||||||
- *
|
|
||||||
- * The solution is to create a new .data segment. This segment is
|
|
||||||
- * filled with data from the current process. Since the contents of
|
|
||||||
- * various sections refer to sections by index, the new .data segment
|
|
||||||
- * is made the last in the table to avoid changing any existing index.
|
|
||||||
-
|
|
||||||
- * This is an example of how the section headers are changed. "Addr"
|
|
||||||
- * is a process virtual address. "Offset" is a file offset.
|
|
||||||
-
|
|
||||||
-raid:/nfs/raid/src/dist-18.56/src> dump -h temacs
|
|
||||||
-
|
|
||||||
-temacs:
|
|
||||||
-
|
|
||||||
- **** SECTION HEADER TABLE ****
|
|
||||||
- [No] Type Flags Addr Offset Size Name
|
|
||||||
- Link Info Adralgn Entsize
|
|
||||||
-
|
|
||||||
- [1] 1 2 0x80480d4 0xd4 0x13 .interp
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [2] 5 2 0x80480e8 0xe8 0x388 .hash
|
|
||||||
- 3 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [3] 11 2 0x8048470 0x470 0x7f0 .dynsym
|
|
||||||
- 4 1 0x4 0x10
|
|
||||||
-
|
|
||||||
- [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [5] 9 2 0x8049010 0x1010 0x338 .rel.plt
|
|
||||||
- 3 7 0x4 0x8
|
|
||||||
-
|
|
||||||
- [6] 1 6 0x8049348 0x1348 0x3 .init
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [7] 1 6 0x804934c 0x134c 0x680 .plt
|
|
||||||
- 0 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [8] 1 6 0x80499cc 0x19cc 0x3c56f .text
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [10] 1 2 0x8085f40 0x3df40 0x69c .rodata
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [12] 1 3 0x8088330 0x3f330 0x20afc .data
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got
|
|
||||||
- 0 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [15] 6 3 0x80a9874 0x60874 0x80 .dynamic
|
|
||||||
- 4 0 0x4 0x8
|
|
||||||
-
|
|
||||||
- [16] 8 3 0x80a98f4 0x608f4 0x449c .bss
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [17] 2 0 0 0x608f4 0x9b90 .symtab
|
|
||||||
- 18 371 0x4 0x10
|
|
||||||
-
|
|
||||||
- [18] 3 0 0 0x6a484 0x8526 .strtab
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [19] 3 0 0 0x729aa 0x93 .shstrtab
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [20] 1 0 0 0x72a3d 0x68b7 .comment
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs
|
|
||||||
-
|
|
||||||
- xemacs:
|
|
||||||
-
|
|
||||||
- **** SECTION HEADER TABLE ****
|
|
||||||
- [No] Type Flags Addr Offset Size Name
|
|
||||||
- Link Info Adralgn Entsize
|
|
||||||
-
|
|
||||||
- [1] 1 2 0x80480d4 0xd4 0x13 .interp
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [2] 5 2 0x80480e8 0xe8 0x388 .hash
|
|
||||||
- 3 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [3] 11 2 0x8048470 0x470 0x7f0 .dynsym
|
|
||||||
- 4 1 0x4 0x10
|
|
||||||
-
|
|
||||||
- [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [5] 9 2 0x8049010 0x1010 0x338 .rel.plt
|
|
||||||
- 3 7 0x4 0x8
|
|
||||||
-
|
|
||||||
- [6] 1 6 0x8049348 0x1348 0x3 .init
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [7] 1 6 0x804934c 0x134c 0x680 .plt
|
|
||||||
- 0 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [8] 1 6 0x80499cc 0x19cc 0x3c56f .text
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [10] 1 2 0x8085f40 0x3df40 0x69c .rodata
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [12] 1 3 0x8088330 0x3f330 0x20afc .data
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got
|
|
||||||
- 0 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [15] 6 3 0x80a9874 0x60874 0x80 .dynamic
|
|
||||||
- 4 0 0x4 0x8
|
|
||||||
-
|
|
||||||
- [16] 8 3 0x80c6800 0x7d800 0 .bss
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [17] 2 0 0 0x7d800 0x9b90 .symtab
|
|
||||||
- 18 371 0x4 0x10
|
|
||||||
-
|
|
||||||
- [18] 3 0 0 0x87390 0x8526 .strtab
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [19] 3 0 0 0x8f8b6 0x93 .shstrtab
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [20] 1 0 0 0x8f949 0x68b7 .comment
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [21] 1 3 0x80a98f4 0x608f4 0x1cf0c .data
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- * This is an example of how the file header is changed. "Shoff" is
|
|
||||||
- * the section header offset within the file. Since that table is
|
|
||||||
- * after the new .data section, it is moved. "Shnum" is the number of
|
|
||||||
- * sections, which we increment.
|
|
||||||
- *
|
|
||||||
- * "Phoff" is the file offset to the program header. "Phentsize" and
|
|
||||||
- * "Shentsz" are the program and section header entries sizes respectively.
|
|
||||||
- * These can be larger than the apparent struct sizes.
|
|
||||||
-
|
|
||||||
- raid:/nfs/raid/src/dist-18.56/src> dump -f temacs
|
|
||||||
-
|
|
||||||
- temacs:
|
|
||||||
-
|
|
||||||
- **** ELF HEADER ****
|
|
||||||
- Class Data Type Machine Version
|
|
||||||
- Entry Phoff Shoff Flags Ehsize
|
|
||||||
- Phentsize Phnum Shentsz Shnum Shstrndx
|
|
||||||
-
|
|
||||||
- 1 1 2 3 1
|
|
||||||
- 0x80499cc 0x34 0x792f4 0 0x34
|
|
||||||
- 0x20 5 0x28 21 19
|
|
||||||
-
|
|
||||||
- raid:/nfs/raid/src/dist-18.56/src> dump -f xemacs
|
|
||||||
-
|
|
||||||
- xemacs:
|
|
||||||
-
|
|
||||||
- **** ELF HEADER ****
|
|
||||||
- Class Data Type Machine Version
|
|
||||||
- Entry Phoff Shoff Flags Ehsize
|
|
||||||
- Phentsize Phnum Shentsz Shnum Shstrndx
|
|
||||||
-
|
|
||||||
- 1 1 2 3 1
|
|
||||||
- 0x80499cc 0x34 0x96200 0 0x34
|
|
||||||
- 0x20 5 0x28 22 19
|
|
||||||
-
|
|
||||||
- * These are the program headers. "Offset" is the file offset to the
|
|
||||||
- * segment. "Vaddr" is the memory load address. "Filesz" is the
|
|
||||||
- * segment size as it appears in the file, and "Memsz" is the size in
|
|
||||||
- * memory. Below, the third segment is the code and the fourth is the
|
|
||||||
- * data: the difference between Filesz and Memsz is .bss
|
|
||||||
-
|
|
||||||
- raid:/nfs/raid/src/dist-18.56/src> dump -o temacs
|
|
||||||
-
|
|
||||||
- temacs:
|
|
||||||
- ***** PROGRAM EXECUTION HEADER *****
|
|
||||||
- Type Offset Vaddr Paddr
|
|
||||||
- Filesz Memsz Flags Align
|
|
||||||
-
|
|
||||||
- 6 0x34 0x8048034 0
|
|
||||||
- 0xa0 0xa0 5 0
|
|
||||||
-
|
|
||||||
- 3 0xd4 0 0
|
|
||||||
- 0x13 0 4 0
|
|
||||||
-
|
|
||||||
- 1 0x34 0x8048034 0
|
|
||||||
- 0x3f2f9 0x3f2f9 5 0x1000
|
|
||||||
-
|
|
||||||
- 1 0x3f330 0x8088330 0
|
|
||||||
- 0x215c4 0x25a60 7 0x1000
|
|
||||||
-
|
|
||||||
- 2 0x60874 0x80a9874 0
|
|
||||||
- 0x80 0 7 0
|
|
||||||
-
|
|
||||||
- raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs
|
|
||||||
-
|
|
||||||
- xemacs:
|
|
||||||
- ***** PROGRAM EXECUTION HEADER *****
|
|
||||||
- Type Offset Vaddr Paddr
|
|
||||||
- Filesz Memsz Flags Align
|
|
||||||
-
|
|
||||||
- 6 0x34 0x8048034 0
|
|
||||||
- 0xa0 0xa0 5 0
|
|
||||||
-
|
|
||||||
- 3 0xd4 0 0
|
|
||||||
- 0x13 0 4 0
|
|
||||||
-
|
|
||||||
- 1 0x34 0x8048034 0
|
|
||||||
- 0x3f2f9 0x3f2f9 5 0x1000
|
|
||||||
-
|
|
||||||
- 1 0x3f330 0x8088330 0
|
|
||||||
- 0x3e4d0 0x3e4d0 7 0x1000
|
|
||||||
-
|
|
||||||
- 2 0x60874 0x80a9874 0
|
|
||||||
- 0x80 0 7 0
|
|
||||||
-
|
|
||||||
-
|
|
||||||
- */
|
|
||||||
-
|
|
||||||
-/* Modified by wtien@urbana.mcd.mot.com of Motorola Inc.
|
|
||||||
- *
|
|
||||||
- * The above mechanism does not work if the unexeced ELF file is being
|
|
||||||
- * re-layout by other applications (such as `strip'). All the applications
|
|
||||||
- * that re-layout the internal of ELF will layout all sections in ascending
|
|
||||||
- * order of their file offsets. After the re-layout, the data2 section will
|
|
||||||
- * still be the LAST section in the section header vector, but its file offset
|
|
||||||
- * is now being pushed far away down, and causes part of it not to be mapped
|
|
||||||
- * in (ie. not covered by the load segment entry in PHDR vector), therefore
|
|
||||||
- * causes the new binary to fail.
|
|
||||||
- *
|
|
||||||
- * The solution is to modify the unexec algorithm to insert the new data2
|
|
||||||
- * section header right before the new bss section header, so their file
|
|
||||||
- * offsets will be in the ascending order. Since some of the section's (all
|
|
||||||
- * sections AFTER the bss section) indexes are now changed, we also need to
|
|
||||||
- * modify some fields to make them point to the right sections. This is done
|
|
||||||
- * by macro PATCH_INDEX. All the fields that need to be patched are:
|
|
||||||
- *
|
|
||||||
- * 1. ELF header e_shstrndx field.
|
|
||||||
- * 2. section header sh_link and sh_info field.
|
|
||||||
- * 3. symbol table entry st_shndx field.
|
|
||||||
- *
|
|
||||||
- * The above example now should look like:
|
|
||||||
-
|
|
||||||
- **** SECTION HEADER TABLE ****
|
|
||||||
- [No] Type Flags Addr Offset Size Name
|
|
||||||
- Link Info Adralgn Entsize
|
|
||||||
-
|
|
||||||
- [1] 1 2 0x80480d4 0xd4 0x13 .interp
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [2] 5 2 0x80480e8 0xe8 0x388 .hash
|
|
||||||
- 3 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [3] 11 2 0x8048470 0x470 0x7f0 .dynsym
|
|
||||||
- 4 1 0x4 0x10
|
|
||||||
-
|
|
||||||
- [4] 3 2 0x8048c60 0xc60 0x3ad .dynstr
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [5] 9 2 0x8049010 0x1010 0x338 .rel.plt
|
|
||||||
- 3 7 0x4 0x8
|
|
||||||
-
|
|
||||||
- [6] 1 6 0x8049348 0x1348 0x3 .init
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [7] 1 6 0x804934c 0x134c 0x680 .plt
|
|
||||||
- 0 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [8] 1 6 0x80499cc 0x19cc 0x3c56f .text
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [9] 1 6 0x8085f3c 0x3df3c 0x3 .fini
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [10] 1 2 0x8085f40 0x3df40 0x69c .rodata
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [11] 1 2 0x80865dc 0x3e5dc 0xd51 .rodata1
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [12] 1 3 0x8088330 0x3f330 0x20afc .data
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [13] 1 3 0x80a8e2c 0x5fe2c 0x89d .data1
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [14] 1 3 0x80a96cc 0x606cc 0x1a8 .got
|
|
||||||
- 0 0 0x4 0x4
|
|
||||||
-
|
|
||||||
- [15] 6 3 0x80a9874 0x60874 0x80 .dynamic
|
|
||||||
- 4 0 0x4 0x8
|
|
||||||
-
|
|
||||||
- [16] 1 3 0x80a98f4 0x608f4 0x1cf0c .data
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [17] 8 3 0x80c6800 0x7d800 0 .bss
|
|
||||||
- 0 0 0x4 0
|
|
||||||
-
|
|
||||||
- [18] 2 0 0 0x7d800 0x9b90 .symtab
|
|
||||||
- 19 371 0x4 0x10
|
|
||||||
-
|
|
||||||
- [19] 3 0 0 0x87390 0x8526 .strtab
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [20] 3 0 0 0x8f8b6 0x93 .shstrtab
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- [21] 1 0 0 0x8f949 0x68b7 .comment
|
|
||||||
- 0 0 0x1 0
|
|
||||||
-
|
|
||||||
- */
|
|
||||||
|
|
||||||
/* We do not use mmap because that fails with NFS.
|
|
||||||
Instead we read the whole file, modify it, and write it out. */
|
|
||||||
@@ -552,45 +211,15 @@ entry_address (void *section_h, ptrdiff_t idx, ptrdiff_t entsize)
|
|
||||||
#define NEW_PROGRAM_H(n) \
|
|
||||||
(*(ElfW (Phdr) *) entry_address (new_program_h, n, new_file_h->e_phentsize))
|
|
||||||
|
|
||||||
-#define PATCH_INDEX(n) ((n) += old_bss_index <= (n))
|
|
||||||
typedef unsigned char byte;
|
|
||||||
|
|
||||||
-/* Return the index of the section named NAME.
|
|
||||||
- SECTION_NAMES, FILE_NAME and FILE_H give information
|
|
||||||
- about the file we are looking in.
|
|
||||||
-
|
|
||||||
- If we don't find the section NAME, that is a fatal error
|
|
||||||
- if NOERROR is false; return -1 if NOERROR is true. */
|
|
||||||
-
|
|
||||||
-static ptrdiff_t
|
|
||||||
-find_section (const char *name, const char *section_names, const char *file_name,
|
|
||||||
- ElfW (Ehdr) *old_file_h, ElfW (Shdr) *old_section_h,
|
|
||||||
- bool noerror)
|
|
||||||
-{
|
|
||||||
- ptrdiff_t idx;
|
|
||||||
-
|
|
||||||
- for (idx = 1; idx < old_file_h->e_shnum; idx++)
|
|
||||||
- {
|
|
||||||
- char const *found_name = section_names + OLD_SECTION_H (idx).sh_name;
|
|
||||||
-#ifdef UNEXELF_DEBUG
|
|
||||||
- fprintf (stderr, "Looking for %s - found %s\n", name, found_name);
|
|
||||||
-#endif
|
|
||||||
- if (strcmp (name, found_name) == 0)
|
|
||||||
- return idx;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (! noerror)
|
|
||||||
- fatal ("Can't find %s in %s", name, file_name);
|
|
||||||
- return -1;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
/* ****************************************************************
|
|
||||||
* unexec
|
|
||||||
*
|
|
||||||
* driving logic.
|
|
||||||
*
|
|
||||||
- * In ELF, this works by replacing the old .bss section with a new
|
|
||||||
- * .data section, and inserting an empty .bss immediately afterwards.
|
|
||||||
+ * In ELF, this works by replacing the old bss SHT_NOBITS section with
|
|
||||||
+ * a new, larger, SHT_PROGBITS section.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
@@ -615,18 +244,16 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
ElfW (Phdr) *old_program_h, *new_program_h;
|
|
||||||
ElfW (Shdr) *old_section_h, *new_section_h;
|
|
||||||
|
|
||||||
- /* Point to the section name table in the old file. */
|
|
||||||
- char *old_section_names;
|
|
||||||
+ /* Point to the section name table. */
|
|
||||||
+ char *old_section_names, *new_section_names;
|
|
||||||
|
|
||||||
ElfW (Phdr) *old_bss_seg, *new_bss_seg;
|
|
||||||
ElfW (Addr) old_bss_addr, new_bss_addr;
|
|
||||||
ElfW (Word) old_bss_size, new_data2_size;
|
|
||||||
- ElfW (Off) new_data2_offset;
|
|
||||||
- ElfW (Addr) new_data2_addr;
|
|
||||||
- ElfW (Off) old_bss_offset;
|
|
||||||
+ ElfW (Off) old_bss_offset, new_data2_offset;
|
|
||||||
|
|
||||||
- ptrdiff_t n, nn;
|
|
||||||
- ptrdiff_t old_bss_index, old_data_index;
|
|
||||||
+ ptrdiff_t n;
|
|
||||||
+ ptrdiff_t old_bss_index;
|
|
||||||
struct stat stat_buf;
|
|
||||||
off_t old_file_size;
|
|
||||||
int mask;
|
|
||||||
@@ -689,7 +316,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
old_bss_offset = old_bss_seg->p_offset + old_bss_seg->p_filesz;
|
|
||||||
old_bss_size = old_bss_seg->p_memsz - old_bss_seg->p_filesz;
|
|
||||||
|
|
||||||
- /* Find the first bss style section in the bss segment range. */
|
|
||||||
+ /* Find the last bss style section in the bss segment range. */
|
|
||||||
old_bss_index = -1;
|
|
||||||
for (n = old_file_h->e_shnum; --n > 0; )
|
|
||||||
{
|
|
||||||
@@ -698,22 +325,15 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
&& shdr->sh_addr >= old_bss_addr
|
|
||||||
&& shdr->sh_addr + shdr->sh_size <= old_bss_addr + old_bss_size
|
|
||||||
&& (old_bss_index == -1
|
|
||||||
- || OLD_SECTION_H (old_bss_index).sh_addr > shdr->sh_addr))
|
|
||||||
+ || OLD_SECTION_H (old_bss_index).sh_addr < shdr->sh_addr))
|
|
||||||
old_bss_index = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (old_bss_index == -1)
|
|
||||||
fatal ("no bss section found");
|
|
||||||
|
|
||||||
- /* Find the old .data section. Figure out parameters of
|
|
||||||
- the new data2 and bss sections. */
|
|
||||||
-
|
|
||||||
- old_data_index = find_section (".data", old_section_names,
|
|
||||||
- old_name, old_file_h, old_section_h, 0);
|
|
||||||
-
|
|
||||||
new_break = sbrk (0);
|
|
||||||
new_bss_addr = (ElfW (Addr)) new_break;
|
|
||||||
- new_data2_addr = old_bss_addr;
|
|
||||||
new_data2_size = new_bss_addr - old_bss_addr;
|
|
||||||
new_data2_offset = old_bss_offset;
|
|
||||||
|
|
||||||
@@ -723,7 +343,6 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
DEBUG_LOG (old_bss_size);
|
|
||||||
DEBUG_LOG (old_bss_offset);
|
|
||||||
DEBUG_LOG (new_bss_addr);
|
|
||||||
- DEBUG_LOG (new_data2_addr);
|
|
||||||
DEBUG_LOG (new_data2_size);
|
|
||||||
DEBUG_LOG (new_data2_offset);
|
|
||||||
#endif
|
|
||||||
@@ -739,7 +358,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
if (new_file < 0)
|
|
||||||
fatal ("Can't creat (%s): %s", new_name, strerror (errno));
|
|
||||||
|
|
||||||
- new_file_size = old_file_size + old_file_h->e_shentsize + new_data2_size;
|
|
||||||
+ new_file_size = old_file_size + new_data2_size;
|
|
||||||
|
|
||||||
if (ftruncate (new_file, new_file_size))
|
|
||||||
fatal ("Can't ftruncate (%s): %s", new_name, strerror (errno));
|
|
||||||
@@ -755,21 +374,18 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
new_file_h = (ElfW (Ehdr) *) new_base;
|
|
||||||
memcpy (new_file_h, old_file_h, old_file_h->e_ehsize);
|
|
||||||
|
|
||||||
- /* Fix up file header. We'll add one section. Section header is
|
|
||||||
- further away now. */
|
|
||||||
+ /* Fix up file header. Section header is further away now. */
|
|
||||||
|
|
||||||
if (new_file_h->e_shoff >= old_bss_offset)
|
|
||||||
new_file_h->e_shoff += new_data2_size;
|
|
||||||
- new_file_h->e_shnum += 1;
|
|
||||||
-
|
|
||||||
- /* Modify the e_shstrndx if necessary. */
|
|
||||||
- PATCH_INDEX (new_file_h->e_shstrndx);
|
|
||||||
|
|
||||||
new_program_h = (ElfW (Phdr) *) ((byte *) new_base + new_file_h->e_phoff);
|
|
||||||
new_section_h = (ElfW (Shdr) *) ((byte *) new_base + new_file_h->e_shoff);
|
|
||||||
|
|
||||||
memcpy (new_program_h, old_program_h,
|
|
||||||
old_file_h->e_phnum * old_file_h->e_phentsize);
|
|
||||||
+ memcpy (new_section_h, old_section_h,
|
|
||||||
+ old_file_h->e_shnum * old_file_h->e_shentsize);
|
|
||||||
|
|
||||||
#ifdef UNEXELF_DEBUG
|
|
||||||
DEBUG_LOG (old_file_h->e_shoff);
|
|
||||||
@@ -788,42 +404,21 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
/* Copy over what we have in memory now for the bss area. */
|
|
||||||
memcpy (new_base + new_data2_offset, (caddr_t) old_bss_addr, new_data2_size);
|
|
||||||
|
|
||||||
- /* Fix up section headers based on new .data2 section. Any section
|
|
||||||
- whose offset or virtual address is after the new .data2 section
|
|
||||||
- gets its value adjusted. .bss size becomes zero. data2 section
|
|
||||||
- header gets added by copying the existing .data header and
|
|
||||||
- modifying the offset, address and size. */
|
|
||||||
-
|
|
||||||
- /* Walk through all section headers, insert the new data2 section right
|
|
||||||
- before the new bss section. */
|
|
||||||
- for (n = 1, nn = 1; n < old_file_h->e_shnum; n++, nn++)
|
|
||||||
+ /* Walk through all section headers, copying data and updating. */
|
|
||||||
+ for (n = 1; n < old_file_h->e_shnum; n++)
|
|
||||||
{
|
|
||||||
caddr_t src;
|
|
||||||
ElfW (Shdr) *old_shdr = &OLD_SECTION_H (n);
|
|
||||||
- ElfW (Shdr) *new_shdr = &NEW_SECTION_H (nn);
|
|
||||||
-
|
|
||||||
- /* If it is (s)bss section, insert the new data2 section before it. */
|
|
||||||
- if (n == old_bss_index)
|
|
||||||
- {
|
|
||||||
- /* Steal the data section header for this data2 section. */
|
|
||||||
- memcpy (new_shdr, &OLD_SECTION_H (old_data_index),
|
|
||||||
- new_file_h->e_shentsize);
|
|
||||||
-
|
|
||||||
- new_shdr->sh_addr = new_data2_addr;
|
|
||||||
- new_shdr->sh_offset = new_data2_offset;
|
|
||||||
- new_shdr->sh_size = new_data2_size;
|
|
||||||
- new_shdr->sh_addralign = 1;
|
|
||||||
- nn++;
|
|
||||||
- new_shdr++;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- memcpy (new_shdr, old_shdr, old_file_h->e_shentsize);
|
|
||||||
+ ElfW (Shdr) *new_shdr = &NEW_SECTION_H (n);
|
|
||||||
|
|
||||||
if (new_shdr->sh_type == SHT_NOBITS
|
|
||||||
&& new_shdr->sh_addr >= old_bss_addr
|
|
||||||
&& (new_shdr->sh_addr + new_shdr->sh_size
|
|
||||||
<= old_bss_addr + old_bss_size))
|
|
||||||
{
|
|
||||||
+ /* This section now has file backing. */
|
|
||||||
+ new_shdr->sh_type = SHT_PROGBITS;
|
|
||||||
+
|
|
||||||
/* SHT_NOBITS sections do not need a valid sh_offset, so it
|
|
||||||
might be incorrect. Write the correct value. */
|
|
||||||
new_shdr->sh_offset = (new_shdr->sh_addr - new_bss_seg->p_vaddr
|
|
||||||
@@ -838,35 +433,20 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
if (strcmp (old_section_names + new_shdr->sh_name, ".plt") == 0)
|
|
||||||
memset (new_shdr->sh_offset + new_base, 0, new_shdr->sh_size);
|
|
||||||
|
|
||||||
- /* Set the new bss and sbss section's size to zero, because
|
|
||||||
- we've already covered this address range by .data2. */
|
|
||||||
- new_shdr->sh_size = 0;
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- /* Any section that was originally placed after the .bss
|
|
||||||
- section should now be off by NEW_DATA2_SIZE. */
|
|
||||||
+ /* Extend the size of the last bss section to cover dumped
|
|
||||||
+ data. */
|
|
||||||
+ if (n == old_bss_index)
|
|
||||||
+ new_shdr->sh_size = new_bss_addr - new_shdr->sh_addr;
|
|
||||||
|
|
||||||
- if (new_shdr->sh_offset >= old_bss_offset)
|
|
||||||
- new_shdr->sh_offset += new_data2_size;
|
|
||||||
-
|
|
||||||
- /* Any section that was originally placed after the section
|
|
||||||
- header table should now be off by the size of one section
|
|
||||||
- header table entry. */
|
|
||||||
- if (new_shdr->sh_offset > new_file_h->e_shoff)
|
|
||||||
- new_shdr->sh_offset += new_file_h->e_shentsize;
|
|
||||||
+ /* We have already copied this section from the current
|
|
||||||
+ process. */
|
|
||||||
+ continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* If any section hdr refers to the section after the new .data
|
|
||||||
- section, make it refer to next one because we have inserted
|
|
||||||
- a new section in between. */
|
|
||||||
-
|
|
||||||
- PATCH_INDEX (new_shdr->sh_link);
|
|
||||||
- /* For symbol tables, info is a symbol table index,
|
|
||||||
- so don't change it. */
|
|
||||||
- if (new_shdr->sh_type != SHT_SYMTAB
|
|
||||||
- && new_shdr->sh_type != SHT_DYNSYM)
|
|
||||||
- PATCH_INDEX (new_shdr->sh_info);
|
|
||||||
+ /* Any section that was originally placed after the .bss
|
|
||||||
+ section should now be offset by NEW_DATA2_SIZE. */
|
|
||||||
+ if (new_shdr->sh_offset >= old_bss_offset)
|
|
||||||
+ new_shdr->sh_offset += new_data2_size;
|
|
||||||
|
|
||||||
/* Now, start to copy the content of sections. */
|
|
||||||
if (new_shdr->sh_type == SHT_NULL
|
|
||||||
@@ -982,24 +562,6 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* __sgi */
|
|
||||||
-
|
|
||||||
- /* Patch st_shndx field of symbol table. */
|
|
||||||
- if (new_shdr->sh_type == SHT_SYMTAB
|
|
||||||
- || new_shdr->sh_type == SHT_DYNSYM)
|
|
||||||
- {
|
|
||||||
- ptrdiff_t num = new_shdr->sh_size / new_shdr->sh_entsize;
|
|
||||||
- ElfW (Sym) *sym = (ElfW (Sym) *) (new_shdr->sh_offset + new_base);
|
|
||||||
- for (; num--; sym++)
|
|
||||||
- {
|
|
||||||
- if (sym->st_shndx == SHN_XINDEX)
|
|
||||||
- fatal ("SHT_SYMTAB_SHNDX unsupported");
|
|
||||||
- if (sym->st_shndx == SHN_UNDEF
|
|
||||||
- || sym->st_shndx >= SHN_LORESERVE)
|
|
||||||
- continue;
|
|
||||||
-
|
|
||||||
- PATCH_INDEX (sym->st_shndx);
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the symbol values of _edata and _end. */
|
|
||||||
@@ -1043,15 +605,10 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
ElfW (Shdr) *new_shdr = &NEW_SECTION_H (symp->st_shndx);
|
|
||||||
if (new_shdr->sh_type != SHT_NOBITS)
|
|
||||||
{
|
|
||||||
- ElfW (Shdr) *old_shdr;
|
|
||||||
+ ElfW (Shdr) *old_shdr = &OLD_SECTION_H (symp->st_shndx);
|
|
||||||
ptrdiff_t reladdr = symp->st_value - new_shdr->sh_addr;
|
|
||||||
ptrdiff_t newoff = reladdr + new_shdr->sh_offset;
|
|
||||||
|
|
||||||
- /* "Unpatch" index. */
|
|
||||||
- nn = symp->st_shndx;
|
|
||||||
- if (nn > old_bss_index)
|
|
||||||
- nn--;
|
|
||||||
- old_shdr = &OLD_SECTION_H (nn);
|
|
||||||
if (old_shdr->sh_type == SHT_NOBITS)
|
|
||||||
memset (new_base + newoff, 0, symp->st_size);
|
|
||||||
else
|
|
||||||
@@ -1066,6 +623,25 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Modify the names of sections we changed from SHT_NOBITS to
|
|
||||||
+ SHT_PROGBITS. This is really just cosmetic, but some tools that
|
|
||||||
+ (wrongly) operate on section names rather than types might be
|
|
||||||
+ confused by a SHT_PROGBITS .bss section. */
|
|
||||||
+ new_section_names = ((char *) new_base
|
|
||||||
+ + NEW_SECTION_H (new_file_h->e_shstrndx).sh_offset);
|
|
||||||
+ for (n = new_file_h->e_shnum; 0 < --n; )
|
|
||||||
+ {
|
|
||||||
+ ElfW (Shdr) *old_shdr = &OLD_SECTION_H (n);
|
|
||||||
+ ElfW (Shdr) *new_shdr = &NEW_SECTION_H (n);
|
|
||||||
+
|
|
||||||
+ /* Replace the leading '.' with ','. When .shstrtab is string
|
|
||||||
+ merged this will rename both .bss and .rela.bss to ,bss and
|
|
||||||
+ .rela,bss. */
|
|
||||||
+ if (old_shdr->sh_type == SHT_NOBITS
|
|
||||||
+ && new_shdr->sh_type == SHT_PROGBITS)
|
|
||||||
+ *(new_section_names + new_shdr->sh_name) = ',';
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/* This loop seeks out relocation sections for the data section, so
|
|
||||||
that it can undo relocations performed by the runtime loader. */
|
|
||||||
for (n = new_file_h->e_shnum; 0 < --n; )
|
|
@ -1,41 +0,0 @@
|
|||||||
From 9b52726df50cc9b4fdfce2ed1dc114311dc60a93 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Sun, 8 Nov 2015 09:36:14 -0800
|
|
||||||
Subject: * src/unexelf.c (NEW_PROGRAM_H): Remove unused macro (Bug#20614).
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [9/10]:
|
|
||||||
|
|
||||||
* src/unexelf.c (NEW_PROGRAM_H): Remove unused macro (Bug#20614).
|
|
||||||
|
|
||||||
Origin: upstream, commit: 2ce0c0674eba9179ba57c537e387bc3f7b0e5b63
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 4 +---
|
|
||||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index 9279c76..f2462d1 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -208,8 +208,6 @@ entry_address (void *section_h, ptrdiff_t idx, ptrdiff_t entsize)
|
|
||||||
(*(ElfW (Shdr) *) entry_address (new_section_h, n, new_file_h->e_shentsize))
|
|
||||||
#define OLD_PROGRAM_H(n) \
|
|
||||||
(*(ElfW (Phdr) *) entry_address (old_program_h, n, old_file_h->e_phentsize))
|
|
||||||
-#define NEW_PROGRAM_H(n) \
|
|
||||||
- (*(ElfW (Phdr) *) entry_address (new_program_h, n, new_file_h->e_phentsize))
|
|
||||||
|
|
||||||
typedef unsigned char byte;
|
|
||||||
|
|
||||||
@@ -250,7 +248,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
ElfW (Phdr) *old_bss_seg, *new_bss_seg;
|
|
||||||
ElfW (Addr) old_bss_addr, new_bss_addr;
|
|
||||||
ElfW (Word) old_bss_size, new_data2_size;
|
|
||||||
- ElfW (Off) old_bss_offset, new_data2_offset;
|
|
||||||
+ ElfW (Off) old_bss_offset, new_data2_offset;
|
|
||||||
|
|
||||||
ptrdiff_t n;
|
|
||||||
ptrdiff_t old_bss_index;
|
|
@ -1,64 +0,0 @@
|
|||||||
From 0de7316751e94c29aeb4b75731ac6e8c9eba77e6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Mon, 16 Nov 2015 17:48:08 -0800
|
|
||||||
Subject: ELF unexec: align section header
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Emacs should build on ppc64el. A problem with the bss has been fixed.
|
|
||||||
|
|
||||||
This upstream patch has been added [10/10]:
|
|
||||||
|
|
||||||
ELF unexec: align section header
|
|
||||||
|
|
||||||
This ports the recent unexelf.c changes to Fedora x86-64
|
|
||||||
when configured with GCC’s -fsanitize=undefined option.
|
|
||||||
* src/unexelf.c (unexec): Align new_data2_size to a multiple
|
|
||||||
of ElfW (Shdr)’s alignment, so that NEW_SECTION_H returns a
|
|
||||||
pointer aligned appropriately for its type.
|
|
||||||
|
|
||||||
Origin: upstream, commit: c9fd597a4cffcae873b25381ee8cc755f0debe95
|
|
||||||
Bug: http://debbugs.gnu.org/20614
|
|
||||||
Bug-Debian: http://bugs.debian.org/808347
|
|
||||||
Added-by: Rob Browning <rlb@defaultvalue.org>
|
|
||||||
---
|
|
||||||
src/unexelf.c | 11 ++++++++---
|
|
||||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexelf.c b/src/unexelf.c
|
|
||||||
index f2462d1..c69be0d 100644
|
|
||||||
--- a/src/unexelf.c
|
|
||||||
+++ b/src/unexelf.c
|
|
||||||
@@ -247,7 +247,7 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
|
|
||||||
ElfW (Phdr) *old_bss_seg, *new_bss_seg;
|
|
||||||
ElfW (Addr) old_bss_addr, new_bss_addr;
|
|
||||||
- ElfW (Word) old_bss_size, new_data2_size;
|
|
||||||
+ ElfW (Word) old_bss_size, bss_size_growth, new_data2_size;
|
|
||||||
ElfW (Off) old_bss_offset, new_data2_offset;
|
|
||||||
|
|
||||||
ptrdiff_t n;
|
|
||||||
@@ -332,7 +332,11 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
|
|
||||||
new_break = sbrk (0);
|
|
||||||
new_bss_addr = (ElfW (Addr)) new_break;
|
|
||||||
- new_data2_size = new_bss_addr - old_bss_addr;
|
|
||||||
+ bss_size_growth = new_bss_addr - old_bss_addr;
|
|
||||||
+ new_data2_size = bss_size_growth;
|
|
||||||
+ new_data2_size += alignof (ElfW (Shdr)) - 1;
|
|
||||||
+ new_data2_size -= new_data2_size % alignof (ElfW (Shdr));
|
|
||||||
+
|
|
||||||
new_data2_offset = old_bss_offset;
|
|
||||||
|
|
||||||
#ifdef UNEXELF_DEBUG
|
|
||||||
@@ -400,7 +404,8 @@ unexec (const char *new_name, const char *old_name)
|
|
||||||
new_bss_seg->p_memsz = new_bss_seg->p_filesz;
|
|
||||||
|
|
||||||
/* Copy over what we have in memory now for the bss area. */
|
|
||||||
- memcpy (new_base + new_data2_offset, (caddr_t) old_bss_addr, new_data2_size);
|
|
||||||
+ memcpy (new_base + new_data2_offset, (caddr_t) old_bss_addr,
|
|
||||||
+ bss_size_growth);
|
|
||||||
|
|
||||||
/* Walk through all section headers, copying data and updating. */
|
|
||||||
for (n = 1; n < old_file_h->e_shnum; n++)
|
|
@ -1,843 +0,0 @@
|
|||||||
From 8ca576def5fd21eac6f7262e21545b0e2b685b92 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?Jan=20Dj=C3=A4rv?= <jan.h.d@swipnet.se>
|
|
||||||
Date: Sat, 18 Oct 2014 18:19:53 +0200
|
|
||||||
Subject: [PATCH] Fix #48862
|
|
||||||
|
|
||||||
---
|
|
||||||
lisp/term/x-win.el | 63 ++++----
|
|
||||||
src/frame.h | 6 +
|
|
||||||
src/gtkutil.c | 423 +++++++++++------------------------------------------
|
|
||||||
src/gtkutil.h | 2 -
|
|
||||||
src/xmenu.c | 6 -
|
|
||||||
src/xterm.h | 4 -
|
|
||||||
6 files changed, 125 insertions(+), 379 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
|
|
||||||
index ca0ae3b..7a41d32 100644
|
|
||||||
--- a/lisp/term/x-win.el
|
|
||||||
+++ b/lisp/term/x-win.el
|
|
||||||
@@ -1475,47 +1475,47 @@ This returns an error if any Emacs frames are X frames, or always under W32."
|
|
||||||
(mapcar (lambda (arg)
|
|
||||||
(cons (purecopy (car arg)) (purecopy (cdr arg))))
|
|
||||||
'(
|
|
||||||
- ("etc/images/new" . "gtk-new")
|
|
||||||
- ("etc/images/open" . "gtk-open")
|
|
||||||
+ ("etc/images/new" . ("document-new" "gtk-new"))
|
|
||||||
+ ("etc/images/open" . ("document-open" "gtk-open"))
|
|
||||||
("etc/images/diropen" . "n:system-file-manager")
|
|
||||||
- ("etc/images/close" . "gtk-close")
|
|
||||||
- ("etc/images/save" . "gtk-save")
|
|
||||||
- ("etc/images/saveas" . "gtk-save-as")
|
|
||||||
- ("etc/images/undo" . "gtk-undo")
|
|
||||||
- ("etc/images/cut" . "gtk-cut")
|
|
||||||
- ("etc/images/copy" . "gtk-copy")
|
|
||||||
- ("etc/images/paste" . "gtk-paste")
|
|
||||||
- ("etc/images/search" . "gtk-find")
|
|
||||||
- ("etc/images/print" . "gtk-print")
|
|
||||||
- ("etc/images/preferences" . "gtk-preferences")
|
|
||||||
- ("etc/images/help" . "gtk-help")
|
|
||||||
- ("etc/images/left-arrow" . "gtk-go-back")
|
|
||||||
- ("etc/images/right-arrow" . "gtk-go-forward")
|
|
||||||
- ("etc/images/home" . "gtk-home")
|
|
||||||
- ("etc/images/jump-to" . "gtk-jump-to")
|
|
||||||
+ ("etc/images/close" . ("window-close" "gtk-close"))
|
|
||||||
+ ("etc/images/save" . ("document-save" "gtk-save"))
|
|
||||||
+ ("etc/images/saveas" . ("document-save-as" "gtk-save-as"))
|
|
||||||
+ ("etc/images/undo" . ("edit-undo" "gtk-undo"))
|
|
||||||
+ ("etc/images/cut" . ("edit-cut" "gtk-cut"))
|
|
||||||
+ ("etc/images/copy" . ("edit-copy" "gtk-copy"))
|
|
||||||
+ ("etc/images/paste" . ("edit-paste" "gtk-paste"))
|
|
||||||
+ ("etc/images/search" . ("edit-find" "gtk-find"))
|
|
||||||
+ ("etc/images/print" . ("document-print" "gtk-print"))
|
|
||||||
+ ("etc/images/preferences" . ("preferences-system" "gtk-preferences"))
|
|
||||||
+ ("etc/images/help" . ("help-browser" "gtk-help"))
|
|
||||||
+ ("etc/images/left-arrow" . ("go-previous" "gtk-go-back"))
|
|
||||||
+ ("etc/images/right-arrow" . ("go-next" "gtk-go-forward"))
|
|
||||||
+ ("etc/images/home" . ("go-home" "gtk-home"))
|
|
||||||
+ ("etc/images/jump-to" . ("go-jump" "gtk-jump-to"))
|
|
||||||
("etc/images/index" . "gtk-index")
|
|
||||||
- ("etc/images/search" . "gtk-find")
|
|
||||||
- ("etc/images/exit" . "gtk-quit")
|
|
||||||
+ ("etc/images/exit" . ("application-exit" "gtk-quit"))
|
|
||||||
("etc/images/cancel" . "gtk-cancel")
|
|
||||||
- ("etc/images/info" . "gtk-info")
|
|
||||||
+ ("etc/images/info" . ("dialog-information" "gtk-info"))
|
|
||||||
("etc/images/bookmark_add" . "n:bookmark_add")
|
|
||||||
;; Used in Gnus and/or MH-E:
|
|
||||||
("etc/images/attach" . "gtk-attach")
|
|
||||||
("etc/images/connect" . "gtk-connect")
|
|
||||||
("etc/images/contact" . "gtk-contact")
|
|
||||||
- ("etc/images/delete" . "gtk-delete")
|
|
||||||
- ("etc/images/describe" . "gtk-properties")
|
|
||||||
+ ("etc/images/delete" . ("edit-delete" "gtk-delete"))
|
|
||||||
+ ("etc/images/describe" . ("ocument-properties" "gtk-properties"))
|
|
||||||
("etc/images/disconnect" . "gtk-disconnect")
|
|
||||||
;; ("etc/images/exit" . "gtk-exit")
|
|
||||||
("etc/images/lock-broken" . "gtk-lock_broken")
|
|
||||||
("etc/images/lock-ok" . "gtk-lock_ok")
|
|
||||||
("etc/images/lock" . "gtk-lock")
|
|
||||||
("etc/images/next-page" . "gtk-next-page")
|
|
||||||
- ("etc/images/refresh" . "gtk-refresh")
|
|
||||||
- ("etc/images/sort-ascending" . "gtk-sort-ascending")
|
|
||||||
+ ("etc/images/refresh" . ("view-refresh" "gtk-refresh"))
|
|
||||||
+ ("etc/images/sort-ascending" . ("view-sort-ascending" "gtk-sort-ascending"))
|
|
||||||
("etc/images/sort-column-ascending" . "gtk-sort-column-ascending")
|
|
||||||
("etc/images/sort-criteria" . "gtk-sort-criteria")
|
|
||||||
- ("etc/images/sort-descending" . "gtk-sort-descending")
|
|
||||||
+ ("etc/images/sort-descending" . ("view-sort-descending"
|
|
||||||
+ "gtk-sort-descending"))
|
|
||||||
("etc/images/sort-row-ascending" . "gtk-sort-row-ascending")
|
|
||||||
("images/gnus/toggle-subscription" . "gtk-task-recurring")
|
|
||||||
("images/mail/compose" . "gtk-mail-compose")
|
|
||||||
@@ -1532,8 +1532,8 @@ This returns an error if any Emacs frames are X frames, or always under W32."
|
|
||||||
("images/mail/spam" . "gtk-spam")
|
|
||||||
;; Used for GDB Graphical Interface
|
|
||||||
("images/gud/break" . "gtk-no")
|
|
||||||
- ("images/gud/recstart" . "gtk-media-record")
|
|
||||||
- ("images/gud/recstop" . "gtk-media-stop")
|
|
||||||
+ ("images/gud/recstart" . ("media-record" "gtk-media-record"))
|
|
||||||
+ ("images/gud/recstop" . ("media-playback-stop" "gtk-media-stop"))
|
|
||||||
;; No themed versions available:
|
|
||||||
;; mail/preview (combining stock_mail and stock_zoom)
|
|
||||||
;; mail/save (combining stock_mail, stock_save and stock_convert)
|
|
||||||
@@ -1542,9 +1542,12 @@ This returns an error if any Emacs frames are X frames, or always under W32."
|
|
||||||
Emacs must be compiled with the Gtk+ toolkit for this to have any effect.
|
|
||||||
A value that begins with n: denotes a named icon instead of a stock icon."
|
|
||||||
:version "22.2"
|
|
||||||
- :type '(choice (repeat (choice symbol
|
|
||||||
- (cons (string :tag "Emacs icon")
|
|
||||||
- (string :tag "Stock/named")))))
|
|
||||||
+ :type '(choice (repeat
|
|
||||||
+ (choice symbol
|
|
||||||
+ (cons (string :tag "Emacs icon")
|
|
||||||
+ (choice (group (string :tag "Named")
|
|
||||||
+ (string :tag "Stock"))
|
|
||||||
+ (string :tag "Stock/named"))))))
|
|
||||||
:group 'x)
|
|
||||||
|
|
||||||
(defcustom icon-map-list '(x-gtk-stock-map)
|
|
||||||
diff --git a/src/frame.h b/src/frame.h
|
|
||||||
index bc49cfa..414de62 100644
|
|
||||||
--- a/src/frame.h
|
|
||||||
+++ b/src/frame.h
|
|
||||||
@@ -725,6 +725,12 @@ default_pixels_per_inch_y (void)
|
|
||||||
/* Pixel height of frame F's tool-bar. */
|
|
||||||
#define FRAME_TOOL_BAR_HEIGHT(f) (f)->tool_bar_height
|
|
||||||
|
|
||||||
+#ifdef USE_GTK
|
|
||||||
+#define FRAME_TOOL_BAR_POSITION(f) (f)->tool_bar_position
|
|
||||||
+#else
|
|
||||||
+#define FRAME_TOOL_BAR_POSITION(f) ((void) f, Qtop)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/* Lines above the top-most window in frame F. */
|
|
||||||
#define FRAME_TOP_MARGIN(F) \
|
|
||||||
(FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F))
|
|
||||||
diff --git a/src/gtkutil.c b/src/gtkutil.c
|
|
||||||
index eddd2b5..33e3cd1 100644
|
|
||||||
--- a/src/gtkutil.c
|
|
||||||
+++ b/src/gtkutil.c
|
|
||||||
@@ -92,6 +92,16 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
#endif
|
|
||||||
#endif /* HAVE_FREETYPE */
|
|
||||||
|
|
||||||
+#if GTK_CHECK_VERSION (3, 10, 0)
|
|
||||||
+#define XG_TEXT_CANCEL "Cancel"
|
|
||||||
+#define XG_TEXT_OK "OK"
|
|
||||||
+#define XG_TEXT_OPEN "Open"
|
|
||||||
+#else
|
|
||||||
+#define XG_TEXT_CANCEL GTK_STOCK_CANCEL
|
|
||||||
+#define XG_TEXT_OK GTK_STOCK_OK
|
|
||||||
+#define XG_TEXT_OPEN GTK_STOCK_OPEN
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#ifndef HAVE_GTK3
|
|
||||||
#ifdef USE_GTK_TOOLTIP
|
|
||||||
#define gdk_window_get_screen(w) gdk_drawable_get_screen (w)
|
|
||||||
@@ -1826,9 +1836,9 @@ xg_get_file_with_chooser (struct frame *f,
|
|
||||||
action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
|
|
||||||
|
|
||||||
filewin = gtk_file_chooser_dialog_new (prompt, gwin, action,
|
|
||||||
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
||||||
+ XG_TEXT_CANCEL, GTK_RESPONSE_CANCEL,
|
|
||||||
(mustmatch_p || only_dir_p ?
|
|
||||||
- GTK_STOCK_OPEN : GTK_STOCK_OK),
|
|
||||||
+ XG_TEXT_OPEN : XG_TEXT_OK),
|
|
||||||
GTK_RESPONSE_OK,
|
|
||||||
NULL);
|
|
||||||
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (filewin), TRUE);
|
|
||||||
@@ -2408,57 +2418,6 @@ make_menu_item (const char *utf8_label,
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW
|
|
||||||
-
|
|
||||||
-static int xg_detached_menus;
|
|
||||||
-
|
|
||||||
-/* Return true if there are detached menus. */
|
|
||||||
-
|
|
||||||
-bool
|
|
||||||
-xg_have_tear_offs (struct frame *f)
|
|
||||||
-{
|
|
||||||
- /* If the frame's menubar height is zero, the menu bar is probably
|
|
||||||
- being redirected outside the window to some kind of global menu;
|
|
||||||
- this situation is the moral equivalent of a tear-off. */
|
|
||||||
- return FRAME_MENUBAR_HEIGHT (f) == 0 || xg_detached_menus > 0;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* Callback invoked when a detached menu window is removed. Here we
|
|
||||||
- decrease the xg_detached_menus count.
|
|
||||||
- WIDGET is the top level window that is removed (the parent of the menu).
|
|
||||||
- CLIENT_DATA is not used. */
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-tearoff_remove (GtkWidget *widget, gpointer client_data)
|
|
||||||
-{
|
|
||||||
- if (xg_detached_menus > 0) --xg_detached_menus;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* Callback invoked when a menu is detached. It increases the
|
|
||||||
- xg_detached_menus count.
|
|
||||||
- WIDGET is the GtkTearoffMenuItem.
|
|
||||||
- CLIENT_DATA is not used. */
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-tearoff_activate (GtkWidget *widget, gpointer client_data)
|
|
||||||
-{
|
|
||||||
- GtkWidget *menu = gtk_widget_get_parent (widget);
|
|
||||||
- if (gtk_menu_get_tearoff_state (GTK_MENU (menu)))
|
|
||||||
- {
|
|
||||||
- ++xg_detached_menus;
|
|
||||||
- g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (widget)),
|
|
||||||
- "destroy",
|
|
||||||
- G_CALLBACK (tearoff_remove), 0);
|
|
||||||
- }
|
|
||||||
-}
|
|
||||||
-#else /* ! HAVE_GTK_TEAROFF_MENU_ITEM_NEW */
|
|
||||||
-bool
|
|
||||||
-xg_have_tear_offs (struct frame *f)
|
|
||||||
-{
|
|
||||||
- return FRAME_MENUBAR_HEIGHT (f) == 0;
|
|
||||||
-}
|
|
||||||
-#endif /* ! HAVE_GTK_TEAROFF_MENU_ITEM_NEW */
|
|
||||||
-
|
|
||||||
/* Create a menu item widget, and connect the callbacks.
|
|
||||||
ITEM describes the menu item.
|
|
||||||
F is the frame the created menu belongs to.
|
|
||||||
@@ -2529,8 +2488,6 @@ xg_create_one_menuitem (widget_value *item,
|
|
||||||
HIGHLIGHT_CB is the callback to call when entering/leaving menu items.
|
|
||||||
If POP_UP_P, create a popup menu.
|
|
||||||
If MENU_BAR_P, create a menu bar.
|
|
||||||
- If ADD_TEAROFF_P, add a tearoff menu item. Ignored if MENU_BAR_P or
|
|
||||||
- the Gtk+ version used does not have tearoffs.
|
|
||||||
TOPMENU is the topmost GtkWidget that others shall be placed under.
|
|
||||||
It may be NULL, in that case we create the appropriate widget
|
|
||||||
(menu bar or menu item depending on POP_UP_P and MENU_BAR_P)
|
|
||||||
@@ -2552,7 +2509,6 @@ create_menus (widget_value *data,
|
|
||||||
GCallback highlight_cb,
|
|
||||||
bool pop_up_p,
|
|
||||||
bool menu_bar_p,
|
|
||||||
- bool add_tearoff_p,
|
|
||||||
GtkWidget *topmenu,
|
|
||||||
xg_menu_cb_data *cl_data,
|
|
||||||
const char *name)
|
|
||||||
@@ -2603,17 +2559,6 @@ create_menus (widget_value *data,
|
|
||||||
"selection-done", deactivate_cb, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
-#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW
|
|
||||||
- if (! menu_bar_p && add_tearoff_p)
|
|
||||||
- {
|
|
||||||
- GtkWidget *tearoff = gtk_tearoff_menu_item_new ();
|
|
||||||
- gtk_menu_shell_append (GTK_MENU_SHELL (wmenu), tearoff);
|
|
||||||
-
|
|
||||||
- g_signal_connect (G_OBJECT (tearoff), "activate",
|
|
||||||
- G_CALLBACK (tearoff_activate), 0);
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
for (item = data; item; item = item->next)
|
|
||||||
{
|
|
||||||
GtkWidget *w;
|
|
||||||
@@ -2627,7 +2572,6 @@ create_menus (widget_value *data,
|
|
||||||
group = NULL;
|
|
||||||
utf8_label = get_utf8_string (item->name);
|
|
||||||
|
|
||||||
- gtk_menu_set_title (GTK_MENU (wmenu), utf8_label);
|
|
||||||
w = gtk_menu_item_new_with_label (utf8_label);
|
|
||||||
gtk_widget_set_sensitive (w, FALSE);
|
|
||||||
if (utf8_label) g_free (utf8_label);
|
|
||||||
@@ -2658,7 +2602,6 @@ create_menus (widget_value *data,
|
|
||||||
highlight_cb,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
- add_tearoff_p,
|
|
||||||
0,
|
|
||||||
cl_data,
|
|
||||||
0);
|
|
||||||
@@ -2716,7 +2659,6 @@ xg_create_widget (const char *type, const char *name, struct frame *f,
|
|
||||||
highlight_cb,
|
|
||||||
pop_up_p,
|
|
||||||
menu_bar_p,
|
|
||||||
- menu_bar_p,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
name);
|
|
||||||
@@ -2826,7 +2768,7 @@ xg_update_menubar (GtkWidget *menubar,
|
|
||||||
{
|
|
||||||
/* Item(s) added. Add all new items in one call. */
|
|
||||||
create_menus (val, f, select_cb, deactivate_cb, highlight_cb,
|
|
||||||
- 0, 1, 0, menubar, cl_data, 0);
|
|
||||||
+ 0, 1, menubar, cl_data, 0);
|
|
||||||
|
|
||||||
/* All updated. */
|
|
||||||
val = 0;
|
|
||||||
@@ -2909,14 +2851,6 @@ xg_update_menubar (GtkWidget *menubar,
|
|
||||||
gtk_label_set_text (wlabel, utf8_label);
|
|
||||||
g_object_notify (G_OBJECT (witem), "label");
|
|
||||||
|
|
||||||
-#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW
|
|
||||||
- /* If this item has a submenu that has been detached, change
|
|
||||||
- the title in the WM decorations also. */
|
|
||||||
- if (submenu && gtk_menu_get_tearoff_state (GTK_MENU (submenu)))
|
|
||||||
- /* Set the title of the detached window. */
|
|
||||||
- gtk_menu_set_title (GTK_MENU (submenu), utf8_label);
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
if (utf8_label) g_free (utf8_label);
|
|
||||||
iter = g_list_next (iter);
|
|
||||||
val = val->next;
|
|
||||||
@@ -2943,7 +2877,7 @@ xg_update_menubar (GtkWidget *menubar,
|
|
||||||
GtkWidget *submenu = create_menus (NULL, f,
|
|
||||||
select_cb, deactivate_cb,
|
|
||||||
highlight_cb,
|
|
||||||
- 0, 0, 0, 0, cl_data, 0);
|
|
||||||
+ 0, 0, 0, cl_data, 0);
|
|
||||||
|
|
||||||
gtk_widget_set_name (w, MENU_ITEM_NAME);
|
|
||||||
gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), w, pos);
|
|
||||||
@@ -3152,17 +3086,6 @@ xg_update_submenu (GtkWidget *submenu,
|
|
||||||
{
|
|
||||||
GtkWidget *w = GTK_WIDGET (iter->data);
|
|
||||||
|
|
||||||
-#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW
|
|
||||||
- /* Skip tearoff items, they have no counterpart in val. */
|
|
||||||
- if (GTK_IS_TEAROFF_MENU_ITEM (w))
|
|
||||||
- {
|
|
||||||
- has_tearoff_p = 1;
|
|
||||||
- iter = g_list_next (iter);
|
|
||||||
- if (iter) w = GTK_WIDGET (iter->data);
|
|
||||||
- else break;
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
/* Remember first radio button in a group. If we get a mismatch in
|
|
||||||
a radio group we must rebuild the whole group so that the connections
|
|
||||||
in GTK becomes correct. */
|
|
||||||
@@ -3250,7 +3173,6 @@ xg_update_submenu (GtkWidget *submenu,
|
|
||||||
highlight_cb,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
- ! has_tearoff_p,
|
|
||||||
submenu,
|
|
||||||
cl_data,
|
|
||||||
0);
|
|
||||||
@@ -4031,187 +3953,6 @@ xg_get_tool_bar_widgets (GtkWidget *vb, GtkWidget **wimage)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-/* This callback is called when a tool item should create a proxy item,
|
|
||||||
- such as for the overflow menu. Also called when the tool bar is detached.
|
|
||||||
- If we don't create a proxy menu item, the detached tool bar will be
|
|
||||||
- blank. */
|
|
||||||
-
|
|
||||||
-static gboolean
|
|
||||||
-xg_tool_bar_menu_proxy (GtkToolItem *toolitem, gpointer user_data)
|
|
||||||
-{
|
|
||||||
- GtkButton *wbutton = GTK_BUTTON (XG_BIN_CHILD (XG_BIN_CHILD (toolitem)));
|
|
||||||
- GtkWidget *vb = XG_BIN_CHILD (wbutton);
|
|
||||||
- GtkWidget *c1;
|
|
||||||
- GtkLabel *wlbl = GTK_LABEL (xg_get_tool_bar_widgets (vb, &c1));
|
|
||||||
- GtkImage *wimage = GTK_IMAGE (c1);
|
|
||||||
- GtkWidget *wmenuitem = gtk_image_menu_item_new_with_label
|
|
||||||
- (wlbl ? gtk_label_get_text (wlbl) : "");
|
|
||||||
- GtkWidget *wmenuimage;
|
|
||||||
-
|
|
||||||
-
|
|
||||||
- if (gtk_button_get_use_stock (wbutton))
|
|
||||||
- wmenuimage = gtk_image_new_from_stock (gtk_button_get_label (wbutton),
|
|
||||||
- GTK_ICON_SIZE_MENU);
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (wbutton));
|
|
||||||
- GtkImageType store_type = gtk_image_get_storage_type (wimage);
|
|
||||||
-
|
|
||||||
- g_object_set (G_OBJECT (settings), "gtk-menu-images", TRUE, NULL);
|
|
||||||
-
|
|
||||||
- if (store_type == GTK_IMAGE_STOCK)
|
|
||||||
- {
|
|
||||||
- gchar *stock_id;
|
|
||||||
- gtk_image_get_stock (wimage, &stock_id, NULL);
|
|
||||||
- wmenuimage = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
|
|
||||||
- }
|
|
||||||
- else if (store_type == GTK_IMAGE_ICON_SET)
|
|
||||||
- {
|
|
||||||
- GtkIconSet *icon_set;
|
|
||||||
- gtk_image_get_icon_set (wimage, &icon_set, NULL);
|
|
||||||
- wmenuimage = gtk_image_new_from_icon_set (icon_set,
|
|
||||||
- GTK_ICON_SIZE_MENU);
|
|
||||||
- }
|
|
||||||
- else if (store_type == GTK_IMAGE_PIXBUF)
|
|
||||||
- {
|
|
||||||
- gint width, height;
|
|
||||||
-
|
|
||||||
- if (settings &&
|
|
||||||
- gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU,
|
|
||||||
- &width, &height))
|
|
||||||
- {
|
|
||||||
- GdkPixbuf *src_pixbuf, *dest_pixbuf;
|
|
||||||
-
|
|
||||||
- src_pixbuf = gtk_image_get_pixbuf (wimage);
|
|
||||||
- dest_pixbuf = gdk_pixbuf_scale_simple (src_pixbuf, width, height,
|
|
||||||
- GDK_INTERP_BILINEAR);
|
|
||||||
-
|
|
||||||
- wmenuimage = gtk_image_new_from_pixbuf (dest_pixbuf);
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- fprintf (stderr, "internal error: GTK_IMAGE_PIXBUF failed\n");
|
|
||||||
- emacs_abort ();
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
- else if (store_type == GTK_IMAGE_ICON_NAME)
|
|
||||||
- {
|
|
||||||
- const gchar *icon_name;
|
|
||||||
- GtkIconSize icon_size;
|
|
||||||
-
|
|
||||||
- gtk_image_get_icon_name (wimage, &icon_name, &icon_size);
|
|
||||||
- wmenuimage = gtk_image_new_from_icon_name (icon_name,
|
|
||||||
- GTK_ICON_SIZE_MENU);
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- fprintf (stderr, "internal error: store_type is %d\n", store_type);
|
|
||||||
- emacs_abort ();
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
- if (wmenuimage)
|
|
||||||
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (wmenuitem), wmenuimage);
|
|
||||||
-
|
|
||||||
- g_signal_connect (G_OBJECT (wmenuitem),
|
|
||||||
- "activate",
|
|
||||||
- G_CALLBACK (xg_tool_bar_proxy_callback),
|
|
||||||
- user_data);
|
|
||||||
-
|
|
||||||
-
|
|
||||||
- g_object_set_data (G_OBJECT (wmenuitem), XG_TOOL_BAR_PROXY_BUTTON,
|
|
||||||
- (gpointer) wbutton);
|
|
||||||
- gtk_tool_item_set_proxy_menu_item (toolitem, "Emacs toolbar item", wmenuitem);
|
|
||||||
- gtk_widget_set_sensitive (wmenuitem,
|
|
||||||
- gtk_widget_get_sensitive (GTK_WIDGET (wbutton)));
|
|
||||||
-
|
|
||||||
- /* Use enter/leave notify to show help. We use the events
|
|
||||||
- rather than the GtkButton specific signals "enter" and
|
|
||||||
- "leave", so we can have only one callback. The event
|
|
||||||
- will tell us what kind of event it is. */
|
|
||||||
- g_signal_connect (G_OBJECT (wmenuitem),
|
|
||||||
- "enter-notify-event",
|
|
||||||
- G_CALLBACK (xg_tool_bar_proxy_help_callback),
|
|
||||||
- user_data);
|
|
||||||
- g_signal_connect (G_OBJECT (wmenuitem),
|
|
||||||
- "leave-notify-event",
|
|
||||||
- G_CALLBACK (xg_tool_bar_proxy_help_callback),
|
|
||||||
- user_data);
|
|
||||||
-
|
|
||||||
- return TRUE;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* This callback is called when a tool bar is detached. We must set
|
|
||||||
- the height of the tool bar to zero when this happens so frame sizes
|
|
||||||
- are correctly calculated.
|
|
||||||
- WBOX is the handle box widget that enables detach/attach of the tool bar.
|
|
||||||
- W is the tool bar widget.
|
|
||||||
- CLIENT_DATA is a pointer to the frame the tool bar belongs to. */
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-xg_tool_bar_detach_callback (GtkHandleBox *wbox,
|
|
||||||
- GtkWidget *w,
|
|
||||||
- gpointer client_data)
|
|
||||||
-{
|
|
||||||
- struct frame *f = client_data;
|
|
||||||
-
|
|
||||||
- g_object_set (G_OBJECT (w), "show-arrow", !x_gtk_whole_detached_tool_bar,
|
|
||||||
- NULL);
|
|
||||||
-
|
|
||||||
- if (f)
|
|
||||||
- {
|
|
||||||
- GtkRequisition req, req2;
|
|
||||||
-
|
|
||||||
- gtk_widget_get_preferred_size (GTK_WIDGET (wbox), NULL, &req);
|
|
||||||
- gtk_widget_get_preferred_size (w, NULL, &req2);
|
|
||||||
- req.width -= req2.width;
|
|
||||||
- req.height -= req2.height;
|
|
||||||
- if (FRAME_TOOLBAR_TOP_HEIGHT (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_TOP_HEIGHT (f) = req.height;
|
|
||||||
- else if (FRAME_TOOLBAR_BOTTOM_HEIGHT (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = req.height;
|
|
||||||
- else if (FRAME_TOOLBAR_RIGHT_WIDTH (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_RIGHT_WIDTH (f) = req.width;
|
|
||||||
- else if (FRAME_TOOLBAR_LEFT_WIDTH (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_LEFT_WIDTH (f) = req.width;
|
|
||||||
- xg_height_or_width_changed (f);
|
|
||||||
- }
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-/* This callback is called when a tool bar is reattached. We must set
|
|
||||||
- the height of the tool bar when this happens so frame sizes
|
|
||||||
- are correctly calculated.
|
|
||||||
- WBOX is the handle box widget that enables detach/attach of the tool bar.
|
|
||||||
- W is the tool bar widget.
|
|
||||||
- CLIENT_DATA is a pointer to the frame the tool bar belongs to. */
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-xg_tool_bar_attach_callback (GtkHandleBox *wbox,
|
|
||||||
- GtkWidget *w,
|
|
||||||
- gpointer client_data)
|
|
||||||
-{
|
|
||||||
- struct frame *f = client_data;
|
|
||||||
- g_object_set (G_OBJECT (w), "show-arrow", TRUE, NULL);
|
|
||||||
-
|
|
||||||
- if (f)
|
|
||||||
- {
|
|
||||||
- GtkRequisition req, req2;
|
|
||||||
-
|
|
||||||
- gtk_widget_get_preferred_size (GTK_WIDGET (wbox), NULL, &req);
|
|
||||||
- gtk_widget_get_preferred_size (w, NULL, &req2);
|
|
||||||
- req.width += req2.width;
|
|
||||||
- req.height += req2.height;
|
|
||||||
- if (FRAME_TOOLBAR_TOP_HEIGHT (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_TOP_HEIGHT (f) = req.height;
|
|
||||||
- else if (FRAME_TOOLBAR_BOTTOM_HEIGHT (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = req.height;
|
|
||||||
- else if (FRAME_TOOLBAR_RIGHT_WIDTH (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_RIGHT_WIDTH (f) = req.width;
|
|
||||||
- else if (FRAME_TOOLBAR_LEFT_WIDTH (f) != 0)
|
|
||||||
- FRAME_TOOLBAR_LEFT_WIDTH (f) = req.width;
|
|
||||||
- xg_height_or_width_changed (f);
|
|
||||||
- }
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
/* This callback is called when the mouse enters or leaves a tool bar item.
|
|
||||||
It is used for displaying and hiding the help text.
|
|
||||||
W is the tool bar item, a button.
|
|
||||||
@@ -4291,11 +4032,7 @@ xg_tool_bar_item_expose_callback (GtkWidget *w,
|
|
||||||
gtk_toolbar_set_orientation (GTK_TOOLBAR (w), o)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#ifdef HAVE_GTK_HANDLE_BOX_NEW
|
|
||||||
-#define TOOLBAR_TOP_WIDGET(x) ((x)->handlebox_widget)
|
|
||||||
-#else
|
|
||||||
#define TOOLBAR_TOP_WIDGET(x) ((x)->toolbar_widget)
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
/* Attach a tool bar to frame F. */
|
|
||||||
|
|
||||||
@@ -4304,31 +4041,15 @@ xg_pack_tool_bar (struct frame *f, Lisp_Object pos)
|
|
||||||
{
|
|
||||||
struct x_output *x = f->output_data.x;
|
|
||||||
bool into_hbox = EQ (pos, Qleft) || EQ (pos, Qright);
|
|
||||||
- GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x);
|
|
||||||
+ GtkWidget *top_widget = x->toolbar_widget;
|
|
||||||
|
|
||||||
toolbar_set_orientation (x->toolbar_widget,
|
|
||||||
into_hbox
|
|
||||||
? GTK_ORIENTATION_VERTICAL
|
|
||||||
: GTK_ORIENTATION_HORIZONTAL);
|
|
||||||
-#ifdef HAVE_GTK_HANDLE_BOX_NEW
|
|
||||||
- if (!x->handlebox_widget)
|
|
||||||
- {
|
|
||||||
- top_widget = x->handlebox_widget = gtk_handle_box_new ();
|
|
||||||
- g_signal_connect (G_OBJECT (x->handlebox_widget), "child-detached",
|
|
||||||
- G_CALLBACK (xg_tool_bar_detach_callback), f);
|
|
||||||
- g_signal_connect (G_OBJECT (x->handlebox_widget), "child-attached",
|
|
||||||
- G_CALLBACK (xg_tool_bar_attach_callback), f);
|
|
||||||
- gtk_container_add (GTK_CONTAINER (x->handlebox_widget),
|
|
||||||
- x->toolbar_widget);
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
if (into_hbox)
|
|
||||||
{
|
|
||||||
-#ifdef HAVE_GTK_HANDLE_BOX_NEW
|
|
||||||
- gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (x->handlebox_widget),
|
|
||||||
- GTK_POS_TOP);
|
|
||||||
-#endif
|
|
||||||
gtk_box_pack_start (GTK_BOX (x->hbox_widget), top_widget,
|
|
||||||
FALSE, FALSE, 0);
|
|
||||||
|
|
||||||
@@ -4341,10 +4062,6 @@ xg_pack_tool_bar (struct frame *f, Lisp_Object pos)
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool vbox_pos = x->menubar_widget != 0;
|
|
||||||
-#ifdef HAVE_GTK_HANDLE_BOX_NEW
|
|
||||||
- gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (x->handlebox_widget),
|
|
||||||
- GTK_POS_LEFT);
|
|
||||||
-#endif
|
|
||||||
gtk_box_pack_start (GTK_BOX (x->vbox_widget), top_widget,
|
|
||||||
FALSE, FALSE, 0);
|
|
||||||
|
|
||||||
@@ -4497,10 +4214,6 @@ xg_make_tool_item (struct frame *f,
|
|
||||||
intptr_t ii = i;
|
|
||||||
gpointer gi = (gpointer) ii;
|
|
||||||
|
|
||||||
- g_signal_connect (G_OBJECT (ti), "create-menu-proxy",
|
|
||||||
- G_CALLBACK (xg_tool_bar_menu_proxy),
|
|
||||||
- gi);
|
|
||||||
-
|
|
||||||
g_signal_connect (G_OBJECT (wb), "clicked",
|
|
||||||
G_CALLBACK (xg_tool_bar_callback),
|
|
||||||
gi);
|
|
||||||
@@ -4614,7 +4327,7 @@ xg_update_tool_bar_sizes (struct frame *f)
|
|
||||||
struct x_output *x = f->output_data.x;
|
|
||||||
GtkRequisition req;
|
|
||||||
int nl = 0, nr = 0, nt = 0, nb = 0;
|
|
||||||
- GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x);
|
|
||||||
+ GtkWidget *top_widget = x->toolbar_widget;
|
|
||||||
|
|
||||||
gtk_widget_get_preferred_size (GTK_WIDGET (top_widget), NULL, &req);
|
|
||||||
if (x->toolbar_in_hbox)
|
|
||||||
@@ -4653,6 +4366,42 @@ xg_update_tool_bar_sizes (struct frame *f)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static char *
|
|
||||||
+find_icon_from_name (char *name,
|
|
||||||
+ GtkIconTheme *icon_theme,
|
|
||||||
+ char **icon_name)
|
|
||||||
+{
|
|
||||||
+#if ! GTK_CHECK_VERSION (3, 10, 0)
|
|
||||||
+ GtkStockItem stock_item;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ if (name[0] == 'n' && name[1] == ':')
|
|
||||||
+ {
|
|
||||||
+ *icon_name = name + 2;
|
|
||||||
+ name = NULL;
|
|
||||||
+
|
|
||||||
+ if (! gtk_icon_theme_has_icon (icon_theme, *icon_name))
|
|
||||||
+ *icon_name = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+#if ! GTK_CHECK_VERSION (3, 10, 0)
|
|
||||||
+ else if (gtk_stock_lookup (name, &stock_item))
|
|
||||||
+ *icon_name = NULL;
|
|
||||||
+#endif
|
|
||||||
+ else if (gtk_icon_theme_has_icon (icon_theme, name))
|
|
||||||
+ {
|
|
||||||
+ *icon_name = name;
|
|
||||||
+ name = NULL;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ name = NULL;
|
|
||||||
+ *icon_name = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return name;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
|
|
||||||
/* Update the tool bar for frame F. Add new buttons and remove old. */
|
|
||||||
|
|
||||||
@@ -4668,6 +4417,9 @@ update_frame_tool_bar (struct frame *f)
|
|
||||||
Lisp_Object style;
|
|
||||||
bool text_image, horiz;
|
|
||||||
struct xg_frame_tb_info *tbinfo;
|
|
||||||
+ GdkScreen *screen;
|
|
||||||
+ GtkIconTheme *icon_theme;
|
|
||||||
+
|
|
||||||
|
|
||||||
if (! FRAME_GTK_WIDGET (f))
|
|
||||||
return;
|
|
||||||
@@ -4702,6 +4454,8 @@ update_frame_tool_bar (struct frame *f)
|
|
||||||
dir = gtk_widget_get_direction (GTK_WIDGET (wtoolbar));
|
|
||||||
|
|
||||||
style = Ftool_bar_get_system_style ();
|
|
||||||
+ screen = gtk_widget_get_screen (GTK_WIDGET (wtoolbar));
|
|
||||||
+ icon_theme = gtk_icon_theme_get_for_screen (screen);
|
|
||||||
|
|
||||||
/* Are we up to date? */
|
|
||||||
tbinfo = g_object_get_data (G_OBJECT (FRAME_GTK_OUTER_WIDGET (f)),
|
|
||||||
@@ -4738,7 +4492,6 @@ update_frame_tool_bar (struct frame *f)
|
|
||||||
struct image *img = NULL;
|
|
||||||
Lisp_Object image;
|
|
||||||
Lisp_Object stock = Qnil;
|
|
||||||
- GtkStockItem stock_item;
|
|
||||||
char *stock_name = NULL;
|
|
||||||
char *icon_name = NULL;
|
|
||||||
Lisp_Object rtl;
|
|
||||||
@@ -4792,32 +4545,28 @@ update_frame_tool_bar (struct frame *f)
|
|
||||||
if (!NILP (specified_file) && !NILP (Ffboundp (Qx_gtk_map_stock)))
|
|
||||||
stock = call1 (Qx_gtk_map_stock, specified_file);
|
|
||||||
|
|
||||||
- if (STRINGP (stock))
|
|
||||||
+ if (CONSP (stock))
|
|
||||||
{
|
|
||||||
- stock_name = SSDATA (stock);
|
|
||||||
- if (stock_name[0] == 'n' && stock_name[1] == ':')
|
|
||||||
- {
|
|
||||||
- GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (wtoolbar));
|
|
||||||
- GtkIconTheme *icon_theme = gtk_icon_theme_get_for_screen (screen);
|
|
||||||
-
|
|
||||||
- icon_name = stock_name + 2;
|
|
||||||
- stock_name = NULL;
|
|
||||||
- stock = Qnil;
|
|
||||||
-
|
|
||||||
- if (! gtk_icon_theme_has_icon (icon_theme, icon_name))
|
|
||||||
- icon_name = NULL;
|
|
||||||
- else
|
|
||||||
- icon_size = gtk_toolbar_get_icon_size (wtoolbar);
|
|
||||||
- }
|
|
||||||
- else if (gtk_stock_lookup (SSDATA (stock), &stock_item))
|
|
||||||
- icon_size = gtk_toolbar_get_icon_size (wtoolbar);
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- stock = Qnil;
|
|
||||||
- stock_name = NULL;
|
|
||||||
- }
|
|
||||||
+ Lisp_Object tem;
|
|
||||||
+ for (tem = stock; CONSP (tem); tem = XCDR (tem))
|
|
||||||
+ if (! NILP (tem) && STRINGP (XCAR (tem)))
|
|
||||||
+ {
|
|
||||||
+ stock_name = find_icon_from_name (SSDATA (XCAR (tem)),
|
|
||||||
+ icon_theme,
|
|
||||||
+ &icon_name);
|
|
||||||
+ if (stock_name || icon_name) break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else if (STRINGP (stock))
|
|
||||||
+ {
|
|
||||||
+ stock_name = find_icon_from_name (SSDATA (stock),
|
|
||||||
+ icon_theme,
|
|
||||||
+ &icon_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (stock_name || icon_name)
|
|
||||||
+ icon_size = gtk_toolbar_get_icon_size (wtoolbar);
|
|
||||||
+
|
|
||||||
if (stock_name == NULL && icon_name == NULL)
|
|
||||||
{
|
|
||||||
/* No stock image, or stock item not known. Try regular
|
|
||||||
@@ -4878,7 +4627,12 @@ update_frame_tool_bar (struct frame *f)
|
|
||||||
w = NULL;
|
|
||||||
else if (stock_name)
|
|
||||||
{
|
|
||||||
+
|
|
||||||
+#if GTK_CHECK_VERSION (3, 10, 0)
|
|
||||||
+ w = gtk_image_new_from_icon_name (stock_name, icon_size);
|
|
||||||
+#else
|
|
||||||
w = gtk_image_new_from_stock (stock_name, icon_size);
|
|
||||||
+#endif
|
|
||||||
g_object_set_data_full (G_OBJECT (w), XG_TOOL_BAR_STOCK_NAME,
|
|
||||||
(gpointer) xstrdup (stock_name),
|
|
||||||
(GDestroyNotify) xfree);
|
|
||||||
@@ -4919,8 +4673,8 @@ update_frame_tool_bar (struct frame *f)
|
|
||||||
if (f->n_tool_bar_items != 0)
|
|
||||||
{
|
|
||||||
if (! x->toolbar_is_packed)
|
|
||||||
- xg_pack_tool_bar (f, f->tool_bar_position);
|
|
||||||
- gtk_widget_show_all (TOOLBAR_TOP_WIDGET (x));
|
|
||||||
+ xg_pack_tool_bar (f, FRAME_TOOL_BAR_POSITION (f));
|
|
||||||
+ gtk_widget_show_all (x->toolbar_widget);
|
|
||||||
if (xg_update_tool_bar_sizes (f))
|
|
||||||
xg_height_or_width_changed (f);
|
|
||||||
}
|
|
||||||
@@ -4939,11 +4693,9 @@ free_frame_tool_bar (struct frame *f)
|
|
||||||
if (x->toolbar_widget)
|
|
||||||
{
|
|
||||||
struct xg_frame_tb_info *tbinfo;
|
|
||||||
- GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x);
|
|
||||||
+ GtkWidget *top_widget = x->toolbar_widget;
|
|
||||||
|
|
||||||
block_input ();
|
|
||||||
- /* We may have created the toolbar_widget in xg_create_tool_bar, but
|
|
||||||
- not the x->handlebox_widget which is created in xg_pack_tool_bar. */
|
|
||||||
if (x->toolbar_is_packed)
|
|
||||||
{
|
|
||||||
if (x->toolbar_in_hbox)
|
|
||||||
@@ -4957,7 +4709,7 @@ free_frame_tool_bar (struct frame *f)
|
|
||||||
gtk_widget_destroy (x->toolbar_widget);
|
|
||||||
|
|
||||||
x->toolbar_widget = 0;
|
|
||||||
- TOOLBAR_TOP_WIDGET (x) = 0;
|
|
||||||
+ x->toolbar_widget = 0;
|
|
||||||
x->toolbar_is_packed = false;
|
|
||||||
FRAME_TOOLBAR_TOP_HEIGHT (f) = FRAME_TOOLBAR_BOTTOM_HEIGHT (f) = 0;
|
|
||||||
FRAME_TOOLBAR_LEFT_WIDTH (f) = FRAME_TOOLBAR_RIGHT_WIDTH (f) = 0;
|
|
||||||
@@ -4982,7 +4734,7 @@ void
|
|
||||||
xg_change_toolbar_position (struct frame *f, Lisp_Object pos)
|
|
||||||
{
|
|
||||||
struct x_output *x = f->output_data.x;
|
|
||||||
- GtkWidget *top_widget = TOOLBAR_TOP_WIDGET (x);
|
|
||||||
+ GtkWidget *top_widget = x->toolbar_widget;
|
|
||||||
|
|
||||||
if (! x->toolbar_widget || ! top_widget)
|
|
||||||
return;
|
|
||||||
@@ -5026,9 +4778,6 @@ xg_initialize (void)
|
|
||||||
|
|
||||||
gdpy_def = NULL;
|
|
||||||
xg_ignore_gtk_scrollbar = 0;
|
|
||||||
-#ifdef HAVE_GTK_TEAROFF_MENU_ITEM_NEW
|
|
||||||
- xg_detached_menus = 0;
|
|
||||||
-#endif
|
|
||||||
xg_menu_cb_list.prev = xg_menu_cb_list.next =
|
|
||||||
xg_menu_item_cb_list.prev = xg_menu_item_cb_list.next = 0;
|
|
||||||
|
|
||||||
diff --git a/src/gtkutil.h b/src/gtkutil.h
|
|
||||||
index 5176be6..37d2900 100644
|
|
||||||
--- a/src/gtkutil.h
|
|
||||||
+++ b/src/gtkutil.h
|
|
||||||
@@ -107,8 +107,6 @@ extern void xg_update_frame_menubar (struct frame *f);
|
|
||||||
|
|
||||||
extern bool xg_event_is_for_menubar (struct frame *, const XEvent *);
|
|
||||||
|
|
||||||
-extern bool xg_have_tear_offs (struct frame *f);
|
|
||||||
-
|
|
||||||
extern ptrdiff_t xg_get_scroll_id_for_window (Display *dpy, Window wid);
|
|
||||||
|
|
||||||
extern void xg_create_scroll_bar (struct frame *f,
|
|
||||||
diff --git a/src/xmenu.c b/src/xmenu.c
|
|
||||||
index 53683c7..77fc4ef 100644
|
|
||||||
--- a/src/xmenu.c
|
|
||||||
+++ b/src/xmenu.c
|
|
||||||
@@ -793,12 +793,6 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p)
|
|
||||||
f->output_data.x->saved_menu_event->type = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#ifdef USE_GTK
|
|
||||||
- /* If we have detached menus, we must update deep so detached menus
|
|
||||||
- also gets updated. */
|
|
||||||
- deep_p = deep_p || xg_have_tear_offs (f);
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
if (deep_p)
|
|
||||||
{
|
|
||||||
/* Make a widget-value tree representing the entire menu trees. */
|
|
||||||
diff --git a/src/xterm.h b/src/xterm.h
|
|
||||||
index 4683a4c..1fb3f0a 100644
|
|
||||||
--- a/src/xterm.h
|
|
||||||
+++ b/src/xterm.h
|
|
||||||
@@ -491,10 +491,6 @@ struct x_output
|
|
||||||
GtkWidget *menubar_widget;
|
|
||||||
/* The tool bar in this frame */
|
|
||||||
GtkWidget *toolbar_widget;
|
|
||||||
-#ifdef HAVE_GTK_HANDLE_BOX_NEW
|
|
||||||
-/* The handle box that makes the tool bar detachable. */
|
|
||||||
- GtkWidget *handlebox_widget;
|
|
||||||
-#endif
|
|
||||||
/* True if tool bar is packed into the hbox widget (i.e. vertical). */
|
|
||||||
bool_bf toolbar_in_hbox : 1;
|
|
||||||
bool_bf toolbar_is_packed : 1;
|
|
||||||
--
|
|
||||||
2.8.0
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
|||||||
|
---
|
||||||
|
lisp/ps-mule.el | 2 ++
|
||||||
|
lisp/textmodes/ispell.el | 14 +++++++++++---
|
||||||
|
2 files changed, 13 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
--- lisp/ps-mule.el
|
--- lisp/ps-mule.el
|
||||||
+++ lisp/ps-mule.el 2009-08-11 12:41:44.000000000 +0000
|
+++ lisp/ps-mule.el 2016-09-19 09:01:56.930605125 +0000
|
||||||
@@ -182,6 +182,8 @@ See also the variable `ps-font-info-data
|
@@ -182,6 +182,8 @@ See also the variable `ps-font-info-data
|
||||||
|
|
||||||
(defconst ps-mule-font-info-database-latin
|
(defconst ps-mule-font-info-database-latin
|
||||||
@ -10,8 +15,8 @@
|
|||||||
"Sample setting of `ps-mule-font-info-database' to use latin fonts.")
|
"Sample setting of `ps-mule-font-info-database' to use latin fonts.")
|
||||||
|
|
||||||
--- lisp/textmodes/ispell.el
|
--- lisp/textmodes/ispell.el
|
||||||
+++ lisp/textmodes/ispell.el 2012-06-26 16:37:56.424010429 +0000
|
+++ lisp/textmodes/ispell.el 2016-09-19 09:01:56.930605125 +0000
|
||||||
@@ -1339,10 +1339,18 @@ Protects against bogus binding of `enabl
|
@@ -1709,10 +1709,18 @@ Protects against bogus binding of `enabl
|
||||||
nil ;; in pipe mode. Disable extended-char-mode
|
nil ;; in pipe mode. Disable extended-char-mode
|
||||||
(nth 6 (or (assoc ispell-current-dictionary ispell-local-dictionary-alist)
|
(nth 6 (or (assoc ispell-current-dictionary ispell-local-dictionary-alist)
|
||||||
(assoc ispell-current-dictionary ispell-dictionary-alist)))))
|
(assoc ispell-current-dictionary ispell-dictionary-alist)))))
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
---
|
||||||
|
lisp/ps-mule.el | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
--- lisp/ps-mule.el
|
--- lisp/ps-mule.el
|
||||||
+++ lisp/ps-mule.el 2009-08-10 16:18:24.585901695 +0000
|
+++ lisp/ps-mule.el 2016-09-19 08:57:28.807664990 +0000
|
||||||
@@ -239,7 +239,7 @@ Currently, data for Japanese and Korean
|
@@ -264,7 +264,7 @@ Currently, data for Japanese and Korean
|
||||||
(japanese-jisx0208
|
(japanese-jisx0208
|
||||||
(normal bdf "jiskan24.bdf"))
|
(normal bdf "jiskan24.bdf"))
|
||||||
(korean-ksc5601
|
(korean-ksc5601
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
--- lisp/startup.el
|
---
|
||||||
+++ lisp/startup.el 2008-03-31 10:23:04.503065574 +0000
|
lisp/startup.el | 3 +++
|
||||||
@@ -2171,6 +2171,9 @@ A fancy display is used on graphic displ
|
1 file changed, 3 insertions(+)
|
||||||
((equal argi "-no-splash")
|
|
||||||
(setq inhibit-startup-screen t))
|
|
||||||
|
|
||||||
+ ((equal argi "-iconic")
|
--- lisp/startup.el
|
||||||
+ (setq inhibit-startup-message t))
|
+++ lisp/startup.el 2016-09-19 09:15:26.871345783 +0000
|
||||||
|
@@ -2349,6 +2349,9 @@ nil default-directory" name)
|
||||||
|
((equal argi "-no-splash")
|
||||||
|
(setq inhibit-startup-screen t))
|
||||||
|
|
||||||
|
+ ((equal argi "-iconic")
|
||||||
|
+ (setq inhibit-startup-message t))
|
||||||
+
|
+
|
||||||
((member argi '("-f" ; what the manual claims
|
((member argi '("-f" ; what the manual claims
|
||||||
"-funcall"
|
"-funcall"
|
||||||
"-e")) ; what the source used to say
|
"-e")) ; what the source used to say
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
|
---
|
||||||
|
src/xrdb.c | 16 ++++++++++++++++
|
||||||
|
1 file changed, 16 insertions(+)
|
||||||
|
|
||||||
--- src/xrdb.c
|
--- src/xrdb.c
|
||||||
+++ src/xrdb.c 2007-05-15 16:01:41.439517668 +0000
|
+++ src/xrdb.c 2016-09-19 09:10:35.504833294 +0000
|
||||||
@@ -39,6 +39,9 @@ along with GNU Emacs. If not, see <http
|
@@ -39,6 +39,9 @@ along with GNU Emacs. If not, see <http
|
||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
@ -10,7 +14,7 @@
|
|||||||
#ifdef HAVE_PWD_H
|
#ifdef HAVE_PWD_H
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -539,6 +542,15 @@ x_load_resources (Display *display, cons
|
@@ -496,6 +499,15 @@ x_load_resources (Display *display, cons
|
||||||
XrmPutLineResource (&rdb, line);
|
XrmPutLineResource (&rdb, line);
|
||||||
|
|
||||||
#endif /* not USE_MOTIF */
|
#endif /* not USE_MOTIF */
|
||||||
@ -26,7 +30,7 @@
|
|||||||
|
|
||||||
user_database = get_user_db (display);
|
user_database = get_user_db (display);
|
||||||
|
|
||||||
@@ -580,6 +592,10 @@ x_load_resources (Display *display, cons
|
@@ -537,6 +549,10 @@ x_load_resources (Display *display, cons
|
||||||
XrmMergeDatabases (db, &rdb);
|
XrmMergeDatabases (db, &rdb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,228 +0,0 @@
|
|||||||
---
|
|
||||||
src/ChangeLog | 11 +++++++++++
|
|
||||||
src/xselect.c | 42 ++++++++++++++++++++++++------------------
|
|
||||||
src/xterm.c | 20 ++++++++++----------
|
|
||||||
src/xterm.h | 16 ++++++++++++++++
|
|
||||||
4 files changed, 61 insertions(+), 28 deletions(-)
|
|
||||||
|
|
||||||
--- src/ChangeLog
|
|
||||||
+++ src/ChangeLog 2014-10-03 02:20:52.000000000 +0000
|
|
||||||
@@ -30,6 +30,17 @@
|
|
||||||
(font_matching_entity): Likewise. If matching entity is found, insert
|
|
||||||
1-item vector with this entity instead of an entity itself (Bug#17125).
|
|
||||||
|
|
||||||
+2014-10-03 Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
+
|
|
||||||
+ Fix x-focus-frame bug with "Not an in-range integer" (Bug#18586).
|
|
||||||
+ * xselect.c (X_SHRT_MAX, X_SHRT_MIN, X_LONG_MAX, X_LONG_MIN)
|
|
||||||
+ (X_ULONG_MAX): Move these macros to xterm.h.
|
|
||||||
+ (x_fill_property_data): Be more generous about allowing either
|
|
||||||
+ signed or unsigned data of the appropriate width.
|
|
||||||
+ * xterm.h (x_display_set_last_user_time): New function.
|
|
||||||
+ All setters of last_user_time changd to use this function.
|
|
||||||
+ If ENABLE_CHECKING, check that the times are in range.
|
|
||||||
+
|
|
||||||
2014-10-02 Eli Zaretskii <eliz@gnu.org>
|
|
||||||
|
|
||||||
* xdisp.c (move_it_by_lines): Call reseat_1 after moving the
|
|
||||||
--- src/xselect.c
|
|
||||||
+++ src/xselect.c 2014-10-29 11:09:29.000000000 +0000
|
|
||||||
@@ -97,13 +97,6 @@ static Lisp_Object Qx_lost_selection_fun
|
|
||||||
is not necessarily sizeof (long). */
|
|
||||||
#define X_LONG_SIZE 4
|
|
||||||
|
|
||||||
-/* Extreme 'short' and 'long' values suitable for libX11. */
|
|
||||||
-#define X_SHRT_MAX 0x7fff
|
|
||||||
-#define X_SHRT_MIN (-1 - X_SHRT_MAX)
|
|
||||||
-#define X_LONG_MAX 0x7fffffff
|
|
||||||
-#define X_LONG_MIN (-1 - X_LONG_MAX)
|
|
||||||
-#define X_ULONG_MAX 0xffffffffUL
|
|
||||||
-
|
|
||||||
/* If this is a smaller number than the max-request-size of the display,
|
|
||||||
emacs will use INCR selection transfer when the selection is larger
|
|
||||||
than this. The max-request-size is usually around 64k, so if you want
|
|
||||||
@@ -2307,10 +2300,10 @@ x_check_property_data (Lisp_Object data)
|
|
||||||
void
|
|
||||||
x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format)
|
|
||||||
{
|
|
||||||
- long val;
|
|
||||||
- long *d32 = (long *) ret;
|
|
||||||
- short *d16 = (short *) ret;
|
|
||||||
- char *d08 = (char *) ret;
|
|
||||||
+ unsigned long val;
|
|
||||||
+ unsigned long *d32 = (unsigned long *) ret;
|
|
||||||
+ unsigned short *d16 = (unsigned short *) ret;
|
|
||||||
+ unsigned char *d08 = (unsigned char *) ret;
|
|
||||||
Lisp_Object iter;
|
|
||||||
|
|
||||||
for (iter = data; CONSP (iter); iter = XCDR (iter))
|
|
||||||
@@ -2318,7 +2311,22 @@ x_fill_property_data (Display *dpy, Lisp
|
|
||||||
Lisp_Object o = XCAR (iter);
|
|
||||||
|
|
||||||
if (INTEGERP (o) || FLOATP (o) || CONSP (o))
|
|
||||||
- val = cons_to_signed (o, LONG_MIN, LONG_MAX);
|
|
||||||
+ {
|
|
||||||
+ if (CONSP (o)
|
|
||||||
+ && RANGED_INTEGERP (X_LONG_MIN >> 16, XCAR (o), X_LONG_MAX >> 16)
|
|
||||||
+ && RANGED_INTEGERP (- (1 << 15), XCDR (o), -1))
|
|
||||||
+ {
|
|
||||||
+ /* cons_to_x_long does not handle negative values for v2.
|
|
||||||
+ For XDnd, v2 might be y of a window, and can be negative.
|
|
||||||
+ The XDnd spec. is not explicit about negative values,
|
|
||||||
+ but let's assume negative v2 is sent modulo 2**16. */
|
|
||||||
+ unsigned long v1 = XINT (XCAR (o)) & 0xffff;
|
|
||||||
+ unsigned long v2 = XINT (XCDR (o)) & 0xffff;
|
|
||||||
+ val = (v1 << 16) | v2;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ val = cons_to_x_long (o);
|
|
||||||
+ }
|
|
||||||
else if (STRINGP (o))
|
|
||||||
{
|
|
||||||
block_input ();
|
|
||||||
@@ -2330,17 +2338,15 @@ x_fill_property_data (Display *dpy, Lisp
|
|
||||||
|
|
||||||
if (format == 8)
|
|
||||||
{
|
|
||||||
- if (CHAR_MIN <= val && val <= CHAR_MAX)
|
|
||||||
- *d08++ = val;
|
|
||||||
- else
|
|
||||||
+ if ((1 << 8) < val && val <= X_ULONG_MAX - (1 << 7))
|
|
||||||
error ("Out of 'char' range");
|
|
||||||
+ *d08++ = val;
|
|
||||||
}
|
|
||||||
else if (format == 16)
|
|
||||||
{
|
|
||||||
- if (SHRT_MIN <= val && val <= SHRT_MAX)
|
|
||||||
- *d16++ = val;
|
|
||||||
- else
|
|
||||||
+ if ((1 << 16) < val && val <= X_ULONG_MAX - (1 << 15))
|
|
||||||
error ("Out of 'short' range");
|
|
||||||
+ *d16++ = val;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
*d32++ = val;
|
|
||||||
--- src/xterm.c
|
|
||||||
+++ src/xterm.c 2014-10-03 02:20:52.000000000 +0000
|
|
||||||
@@ -5961,7 +5961,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SelectionNotify:
|
|
||||||
- dpyinfo->last_user_time = event->xselection.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xselection.time);
|
|
||||||
#ifdef USE_X_TOOLKIT
|
|
||||||
if (! x_window_to_frame (dpyinfo, event->xselection.requestor))
|
|
||||||
goto OTHER;
|
|
||||||
@@ -5970,7 +5970,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SelectionClear: /* Someone has grabbed ownership. */
|
|
||||||
- dpyinfo->last_user_time = event->xselectionclear.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xselectionclear.time);
|
|
||||||
#ifdef USE_X_TOOLKIT
|
|
||||||
if (! x_window_to_frame (dpyinfo, event->xselectionclear.window))
|
|
||||||
goto OTHER;
|
|
||||||
@@ -5986,7 +5986,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SelectionRequest: /* Someone wants our selection. */
|
|
||||||
- dpyinfo->last_user_time = event->xselectionrequest.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xselectionrequest.time);
|
|
||||||
#ifdef USE_X_TOOLKIT
|
|
||||||
if (!x_window_to_frame (dpyinfo, event->xselectionrequest.owner))
|
|
||||||
goto OTHER;
|
|
||||||
@@ -6005,7 +6005,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PropertyNotify:
|
|
||||||
- dpyinfo->last_user_time = event->xproperty.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xproperty.time);
|
|
||||||
f = x_top_window_to_frame (dpyinfo, event->xproperty.window);
|
|
||||||
if (f && event->xproperty.atom == dpyinfo->Xatom_net_wm_state)
|
|
||||||
if (x_handle_net_wm_state (f, &event->xproperty)
|
|
||||||
@@ -6193,7 +6193,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
|
|
||||||
case KeyPress:
|
|
||||||
|
|
||||||
- dpyinfo->last_user_time = event->xkey.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xkey.time);
|
|
||||||
ignore_next_mouse_click_timeout = 0;
|
|
||||||
|
|
||||||
#if defined (USE_X_TOOLKIT) || defined (USE_GTK)
|
|
||||||
@@ -6527,7 +6527,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case KeyRelease:
|
|
||||||
- dpyinfo->last_user_time = event->xkey.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xkey.time);
|
|
||||||
#ifdef HAVE_X_I18N
|
|
||||||
/* Don't dispatch this event since XtDispatchEvent calls
|
|
||||||
XFilterEvent, and two calls in a row may freeze the
|
|
||||||
@@ -6538,7 +6538,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case EnterNotify:
|
|
||||||
- dpyinfo->last_user_time = event->xcrossing.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xcrossing.time);
|
|
||||||
x_detect_focus_change (dpyinfo, any, event, &inev.ie);
|
|
||||||
|
|
||||||
f = any;
|
|
||||||
@@ -6563,7 +6563,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
goto OTHER;
|
|
||||||
|
|
||||||
case LeaveNotify:
|
|
||||||
- dpyinfo->last_user_time = event->xcrossing.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xcrossing.time);
|
|
||||||
x_detect_focus_change (dpyinfo, any, event, &inev.ie);
|
|
||||||
|
|
||||||
f = x_top_window_to_frame (dpyinfo, event->xcrossing.window);
|
|
||||||
@@ -6597,7 +6597,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
|
|
||||||
case MotionNotify:
|
|
||||||
{
|
|
||||||
- dpyinfo->last_user_time = event->xmotion.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xmotion.time);
|
|
||||||
previous_help_echo_string = help_echo_string;
|
|
||||||
help_echo_string = Qnil;
|
|
||||||
|
|
||||||
@@ -6738,7 +6738,7 @@ handle_one_xevent (struct x_display_info
|
|
||||||
|
|
||||||
memset (&compose_status, 0, sizeof (compose_status));
|
|
||||||
dpyinfo->last_mouse_glyph_frame = NULL;
|
|
||||||
- dpyinfo->last_user_time = event->xbutton.time;
|
|
||||||
+ x_display_set_last_user_time (dpyinfo, event->xbutton.time);
|
|
||||||
|
|
||||||
f = (x_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame
|
|
||||||
: x_window_to_frame (dpyinfo, event->xbutton.window));
|
|
||||||
--- src/xterm.h
|
|
||||||
+++ src/xterm.h 2014-10-03 02:20:52.000000000 +0000
|
|
||||||
@@ -644,6 +644,13 @@ struct x_output
|
|
||||||
int move_offset_left;
|
|
||||||
};
|
|
||||||
|
|
||||||
+/* Extreme 'short' and 'long' values suitable for libX11. */
|
|
||||||
+#define X_SHRT_MAX 0x7fff
|
|
||||||
+#define X_SHRT_MIN (-1 - X_SHRT_MAX)
|
|
||||||
+#define X_LONG_MAX 0x7fffffff
|
|
||||||
+#define X_LONG_MIN (-1 - X_LONG_MAX)
|
|
||||||
+#define X_ULONG_MAX 0xffffffffUL
|
|
||||||
+
|
|
||||||
#define No_Cursor (None)
|
|
||||||
|
|
||||||
enum
|
|
||||||
@@ -959,6 +966,15 @@ extern int x_x_to_emacs_modifiers (struc
|
|
||||||
extern int x_display_pixel_height (struct x_display_info *);
|
|
||||||
extern int x_display_pixel_width (struct x_display_info *);
|
|
||||||
|
|
||||||
+INLINE void
|
|
||||||
+x_display_set_last_user_time (struct x_display_info *dpyinfo, Time t)
|
|
||||||
+{
|
|
||||||
+#ifdef ENABLE_CHECKING
|
|
||||||
+ eassert (t <= X_ULONG_MAX);
|
|
||||||
+#endif
|
|
||||||
+ dpyinfo->last_user_time = t;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
extern void x_set_sticky (struct frame *, Lisp_Object, Lisp_Object);
|
|
||||||
extern void x_wait_for_event (struct frame *, int);
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
|||||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
--- lisp/textmodes/flyspell.el
|
--- lisp/textmodes/flyspell.el
|
||||||
+++ lisp/textmodes/flyspell.el 2014-10-21 14:14:59.191838679 +0000
|
+++ lisp/textmodes/flyspell.el 2016-09-19 09:22:48.535025631 +0000
|
||||||
@@ -286,6 +286,12 @@ If this variable is nil, all regions are
|
@@ -287,6 +287,12 @@ If this variable is nil, all regions are
|
||||||
:type 'key-sequence
|
:type 'key-sequence
|
||||||
:group 'flyspell)
|
:group 'flyspell)
|
||||||
|
|
||||||
@ -17,25 +17,25 @@
|
|||||||
;;*---------------------------------------------------------------------*/
|
;;*---------------------------------------------------------------------*/
|
||||||
;;* Mode specific options */
|
;;* Mode specific options */
|
||||||
;;* ------------------------------------------------------------- */
|
;;* ------------------------------------------------------------- */
|
||||||
@@ -309,7 +315,6 @@ property of the major mode name.")
|
@@ -310,7 +316,6 @@ property of the major mode name.")
|
||||||
;;*--- mail mode -------------------------------------------------------*/
|
;;*--- mail mode -------------------------------------------------------*/
|
||||||
(put 'mail-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
|
(put 'mail-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
|
||||||
(put 'message-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
|
(put 'message-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
|
||||||
-(defvar message-signature-separator)
|
-(defvar message-signature-separator)
|
||||||
(defun mail-mode-flyspell-verify ()
|
(defun mail-mode-flyspell-verify ()
|
||||||
"Function used for `flyspell-generic-check-word-predicate' in Mail mode."
|
"Function used for `flyspell-generic-check-word-predicate' in Mail mode."
|
||||||
(let ((header-end (save-excursion
|
(let* ((header-end (save-excursion
|
||||||
@@ -321,11 +326,11 @@ property of the major mode name.")
|
@@ -322,11 +327,11 @@ property of the major mode name.")
|
||||||
nil t)
|
nil t)
|
||||||
(point)))
|
(point)))
|
||||||
(signature-begin
|
(signature-begin
|
||||||
- (if (not (boundp 'message-signature-separator))
|
- (if (not (boundp 'message-signature-separator))
|
||||||
+ (if (not (boundp 'flyspell-signature-separator))
|
+ (if (not (boundp 'flyspell-signature-separator))
|
||||||
(point-max)
|
(point-max)
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(goto-char (point-max))
|
(goto-char (point-max))
|
||||||
- (re-search-backward message-signature-separator nil t)
|
- (re-search-backward message-signature-separator
|
||||||
+ (re-search-backward flyspell-signature-separator nil t)
|
+ (re-search-backward flyspell-signature-separator
|
||||||
(point)))))
|
(max header-end (- (point) 4000)) t)
|
||||||
|
(point)))))
|
||||||
(cond ((< (point) header-end)
|
(cond ((< (point) header-end)
|
||||||
(and (save-excursion (beginning-of-line)
|
|
||||||
|
@ -1,30 +1,25 @@
|
|||||||
---
|
---
|
||||||
configure | 2 ++
|
configure | 1 +
|
||||||
configure.ac | 2 ++
|
configure.ac | 1 +
|
||||||
lib-src/Makefile.in | 6 ++++--
|
2 files changed, 2 insertions(+)
|
||||||
3 files changed, 8 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
Index: configure
|
--- configure.ac
|
||||||
===================================================================
|
+++ configure.ac 2016-09-19 08:54:17.383277267 +0000
|
||||||
--- configure.orig
|
@@ -2203,6 +2203,7 @@ fi
|
||||||
+++ configure
|
|
||||||
@@ -10951,6 +10951,7 @@ fi
|
|
||||||
use_mmap_for_buffers=no
|
use_mmap_for_buffers=no
|
||||||
case "$opsys" in
|
case "$opsys" in
|
||||||
cygwin|freebsd|irix6-5) use_mmap_for_buffers=yes ;;
|
cygwin|mingw32|freebsd|irix6-5) use_mmap_for_buffers=yes ;;
|
||||||
+ gnu-linux) use_mmap_for_buffers=yes ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
Index: configure.ac
|
|
||||||
===================================================================
|
|
||||||
--- configure.ac.orig
|
|
||||||
+++ configure.ac
|
|
||||||
@@ -2048,6 +2048,7 @@ fi
|
|
||||||
use_mmap_for_buffers=no
|
|
||||||
case "$opsys" in
|
|
||||||
cygwin|freebsd|irix6-5) use_mmap_for_buffers=yes ;;
|
|
||||||
+ gnu-linux) use_mmap_for_buffers=yes ;;
|
+ gnu-linux) use_mmap_for_buffers=yes ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AC_FUNC_MMAP
|
AC_FUNC_MMAP
|
||||||
|
--- configure
|
||||||
|
+++ configure 2016-09-19 08:54:30.971020865 +0000
|
||||||
|
@@ -11572,6 +11572,7 @@ fi
|
||||||
|
use_mmap_for_buffers=no
|
||||||
|
case "$opsys" in
|
||||||
|
cygwin|mingw32|freebsd|irix6-5) use_mmap_for_buffers=yes ;;
|
||||||
|
+ gnu-linux) use_mmap_for_buffers=yes ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
---
|
---
|
||||||
src/xmenu.c | 4 ++--
|
src/emacs-module.c | 1 +
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
src/xmenu.c | 4 ++--
|
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
--- src/xmenu.c
|
--- src/xmenu.c
|
||||||
+++ src/xmenu.c 2014-10-21 14:06:22.923837970 +0000
|
+++ src/xmenu.c 2016-09-19 09:01:56.930605125 +0000
|
||||||
@@ -2031,8 +2031,8 @@ Lisp_Object
|
@@ -1922,8 +1922,8 @@ Lisp_Object
|
||||||
xw_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents)
|
xw_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents)
|
||||||
{
|
{
|
||||||
Lisp_Object title;
|
Lisp_Object title;
|
||||||
@ -15,3 +16,13 @@
|
|||||||
ptrdiff_t specpdl_count = SPECPDL_INDEX ();
|
ptrdiff_t specpdl_count = SPECPDL_INDEX ();
|
||||||
|
|
||||||
check_window_system (f);
|
check_window_system (f);
|
||||||
|
--- src/emacs-module.c
|
||||||
|
+++ src/emacs-module.c 2016-09-20 09:36:52.881778063 +0000
|
||||||
|
@@ -787,6 +787,7 @@ usage: (module-call ENVOBJ &rest ARGLIST
|
||||||
|
default:
|
||||||
|
eassume (false);
|
||||||
|
}
|
||||||
|
+ return Qnil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,21 +4,21 @@
|
|||||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
--- lisp/ldefs-boot.el
|
--- lisp/ldefs-boot.el
|
||||||
+++ lisp/ldefs-boot.el 2015-04-30 13:03:34.058018924 +0000
|
+++ lisp/ldefs-boot.el 2016-09-19 09:01:36.090998408 +0000
|
||||||
@@ -21554,9 +21554,9 @@ With prefix argument ARG, restart the Pr
|
@@ -22107,9 +22107,9 @@ With prefix argument ARG, restart the Pr
|
||||||
;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (21710 25077 708662 334000))
|
;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (22388 5707 728611 808000))
|
||||||
;;; Generated autoloads from ps-bdf.el
|
;;; Generated autoloads from ps-bdf.el
|
||||||
|
|
||||||
-(defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/local/share/emacs/fonts/bdf")) "\
|
-(defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/local/share/emacs/fonts/bdf")) "\
|
||||||
+(defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/share/fonts/bdf")) "\
|
+(defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/share/fonts/bdf")) "\
|
||||||
List of directories to search for `BDF' font files.
|
List of directories to search for `BDF' font files.
|
||||||
-The default value is '(\"/usr/local/share/emacs/fonts/bdf\").")
|
-The default value is (\"/usr/local/share/emacs/fonts/bdf\").")
|
||||||
+The default value is '(\"/usr/share/fonts/bdf\").")
|
+The default value is (\"/usr/share/fonts/bdf\").")
|
||||||
|
|
||||||
(custom-autoload 'bdf-directory-list "ps-bdf" t)
|
(custom-autoload 'bdf-directory-list "ps-bdf" t)
|
||||||
|
|
||||||
--- lisp/ps-bdf.el
|
--- lisp/ps-bdf.el
|
||||||
+++ lisp/ps-bdf.el 2009-08-10 16:21:47.000000000 +0000
|
+++ lisp/ps-bdf.el 2016-09-19 09:00:21.828399872 +0000
|
||||||
@@ -42,9 +42,9 @@
|
@@ -42,9 +42,9 @@
|
||||||
(defcustom bdf-directory-list
|
(defcustom bdf-directory-list
|
||||||
(if (memq system-type '(ms-dos windows-nt))
|
(if (memq system-type '(ms-dos windows-nt))
|
||||||
@ -26,8 +26,8 @@
|
|||||||
- '("/usr/local/share/emacs/fonts/bdf"))
|
- '("/usr/local/share/emacs/fonts/bdf"))
|
||||||
+ '("/usr/share/fonts/bdf"))
|
+ '("/usr/share/fonts/bdf"))
|
||||||
"List of directories to search for `BDF' font files.
|
"List of directories to search for `BDF' font files.
|
||||||
-The default value is '(\"/usr/local/share/emacs/fonts/bdf\")."
|
-The default value is (\"/usr/local/share/emacs/fonts/bdf\")."
|
||||||
+The default value is '(\"/usr/share/fonts/bdf\")."
|
+The default value is (\"/usr/share/fonts/bdf\")."
|
||||||
:type '(repeat :tag "BDF font directory list"
|
:type '(repeat :tag "BDF font directory list"
|
||||||
(directory :tag "BDF font directory"))
|
(directory :tag "BDF font directory"))
|
||||||
:group 'ps-print-miscellany)
|
:group 'ps-print-miscellany)
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
--- src/xfns.c
|
--- src/xfns.c
|
||||||
+++ src/xfns.c 2014-10-21 14:09:49.520338231 +0000
|
+++ src/xfns.c 2016-09-19 09:10:35.504833294 +0000
|
||||||
@@ -1648,8 +1648,8 @@ static XIMStyle best_xim_style (XIMStyle
|
@@ -1957,8 +1957,8 @@ static XIMStyle best_xim_style (XIMStyle
|
||||||
|
|
||||||
static const XIMStyle supported_xim_styles[] =
|
static const XIMStyle supported_xim_styles[] =
|
||||||
{
|
{
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:dd47d71dd2a526cf6b47cb49af793ec2e26af69a0951cc40e43ae290eacfc34e
|
|
||||||
size 39759804
|
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
Makefile.in | 11 +---
|
Makefile.in | 7 +-
|
||||||
configure | 4 -
|
configure | 6 --
|
||||||
configure.ac | 4 -
|
configure.ac | 6 --
|
||||||
doc/man/etags.1 | 20 ++++----
|
doc/man/etags.1 | 20 ++++----
|
||||||
lib-src/Makefile.in | 6 +-
|
lib-src/Makefile.in | 4 -
|
||||||
lib-src/pop.c | 1
|
lib-src/pop.c | 1
|
||||||
lisp/cmuscheme.el | 3 -
|
lisp/cmuscheme.el | 3 -
|
||||||
lisp/international/mule-cmds.el | 1
|
lisp/international/mule-cmds.el | 1
|
||||||
@ -16,35 +16,30 @@
|
|||||||
site-lisp/term/kvt.el | 97 ++++++++++++++++++++++++++++++++++++++++
|
site-lisp/term/kvt.el | 97 ++++++++++++++++++++++++++++++++++++++++
|
||||||
site-lisp/term/linux.el | 79 ++++++++++++++++++++++++++++++++
|
site-lisp/term/linux.el | 79 ++++++++++++++++++++++++++++++++
|
||||||
site-lisp/term/locale.el | 13 +++++
|
site-lisp/term/locale.el | 13 +++++
|
||||||
src/lisp.mk | 2
|
17 files changed, 445 insertions(+), 32 deletions(-)
|
||||||
18 files changed, 448 insertions(+), 33 deletions(-)
|
|
||||||
|
|
||||||
--- Makefile.in
|
--- Makefile.in
|
||||||
+++ Makefile.in 2014-10-21 14:24:43.751837432 +0000
|
+++ Makefile.in 2016-09-19 09:49:37.296950020 +0000
|
||||||
@@ -490,12 +490,8 @@ install-arch-dep: src install-arch-indep
|
@@ -493,8 +493,8 @@ install-arch-dep: src install-arch-indep
|
||||||
libexecdir="${libexecdir}" archlibdir="${archlibdir}" \
|
umask 022; ${MKDIR_P} "$(DESTDIR)${bindir}"
|
||||||
INSTALL_STRIP=${INSTALL_STRIP}
|
$(MAKE) -C lib-src install
|
||||||
if test "${ns_self_contained}" = "no"; then \
|
ifeq (${ns_self_contained},no)
|
||||||
- ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACSFULL)" || exit 1 ; \
|
- ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACSFULL)"
|
||||||
- chmod 1755 "$(DESTDIR)${bindir}/$(EMACSFULL)" || true; \
|
- -chmod 755 "$(DESTDIR)${bindir}/$(EMACSFULL)"
|
||||||
- if test "x${NO_BIN_LINK}" = x; then \
|
+ ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACS)"
|
||||||
- rm -f "$(DESTDIR)${bindir}/$(EMACS)" ; \
|
+ -chmod 755 "$(DESTDIR)${bindir}/$(EMACS)"
|
||||||
- cd "$(DESTDIR)${bindir}" && $(LN_S_FILEONLY) $(EMACSFULL) $(EMACS); \
|
ifndef NO_BIN_LINK
|
||||||
- fi; \
|
rm -f "$(DESTDIR)${bindir}/$(EMACS)"
|
||||||
+ ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} $(DESTDIR)${bindir}/$(EMACS) || exit 1 ; \
|
cd "$(DESTDIR)${bindir}" && $(LN_S_FILEONLY) $(EMACSFULL) $(EMACS)
|
||||||
+ chmod 1755 $(DESTDIR)${bindir}/$(EMACS) || true; \
|
@@ -683,6 +683,7 @@ install-man:
|
||||||
else \
|
|
||||||
subdir=${ns_appresdir}/site-lisp; \
|
|
||||||
${write_subdir} || exit 1; \
|
|
||||||
@@ -684,6 +680,7 @@ install-man:
|
|
||||||
umask 022; ${MKDIR_P} "$(DESTDIR)${man1dir}"
|
umask 022; ${MKDIR_P} "$(DESTDIR)${man1dir}"
|
||||||
thisdir=`/bin/pwd`; \
|
thisdir=`/bin/pwd`; \
|
||||||
cd ${mansrcdir}; \
|
cd ${mansrcdir}; \
|
||||||
+ cp ctags.1 gnuctags.1; \
|
+ cp ctags.1 gnuctags.1; \
|
||||||
for page in *.1; do \
|
for page in *.1; do \
|
||||||
|
test "$$page" = ChangeLog.1 && continue; \
|
||||||
dest=`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1; \
|
dest=`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1; \
|
||||||
(cd "$${thisdir}"; \
|
@@ -771,7 +772,7 @@ uninstall: uninstall-$(NTDIR) uninstall-
|
||||||
@@ -770,7 +767,7 @@ uninstall: uninstall-$(NTDIR) uninstall-
|
|
||||||
for page in *.1; do \
|
for page in *.1; do \
|
||||||
rm -f "$(DESTDIR)${man1dir}"/`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1$$ext; done; \
|
rm -f "$(DESTDIR)${man1dir}"/`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1$$ext; done; \
|
||||||
fi)
|
fi)
|
||||||
@ -53,34 +48,38 @@
|
|||||||
(if cd "$(DESTDIR)${icondir}"; then \
|
(if cd "$(DESTDIR)${icondir}"; then \
|
||||||
rm -f hicolor/*x*/apps/${EMACS_NAME}.png \
|
rm -f hicolor/*x*/apps/${EMACS_NAME}.png \
|
||||||
hicolor/scalable/apps/${EMACS_NAME}.svg \
|
hicolor/scalable/apps/${EMACS_NAME}.svg \
|
||||||
--- configure.ac
|
--- configure
|
||||||
+++ configure.ac 2013-05-21 16:02:45.000000000 +0000
|
+++ configure 2016-09-19 09:53:00.097191627 +0000
|
||||||
@@ -1595,8 +1595,8 @@ fi
|
@@ -10749,10 +10749,8 @@ fi
|
||||||
LD_SWITCH_X_SITE_RPATH=
|
LD_SWITCH_X_SITE_RPATH=
|
||||||
if test "${x_libraries}" != NONE; then
|
if test "${x_libraries}" != NONE; then
|
||||||
if test -n "${x_libraries}"; then
|
if test -n "${x_libraries}"; then
|
||||||
- LD_SWITCH_X_SITE=-L`echo ${x_libraries} | sed -e "s/:/ -L/g"`
|
- LD_SWITCH_X_SITE=-L`$as_echo "$x_libraries" | sed -e 's/:/ -L/g'`
|
||||||
- LD_SWITCH_X_SITE_RPATH=-Wl,-rpath,`echo ${x_libraries} | sed -e "s/:/ -Wl,-rpath,/g"`
|
- LD_SWITCH_X_SITE_RPATH=-Wl,-rpath,`
|
||||||
|
- $as_echo "$x_libraries" | sed -e 's/:/ -Wl,-rpath,/g'
|
||||||
|
- `
|
||||||
+ LD_SWITCH_X_SITE="-L ${x_libraries%%:*}"
|
+ LD_SWITCH_X_SITE="-L ${x_libraries%%:*}"
|
||||||
+ LD_SWITCH_X_SITE_RPATH="-Wl,-rpath-link,${x_libraries%%:*}"
|
+ LD_SWITCH_X_SITE_RPATH="-Wl,-rpath-link,${x_libraries%%:*}"
|
||||||
fi
|
fi
|
||||||
x_default_search_path=""
|
x_default_search_path=""
|
||||||
x_search_path=${x_libraries}
|
x_search_path=${x_libraries}
|
||||||
--- configure
|
--- configure.ac
|
||||||
+++ configure 2013-05-21 16:02:54.000000000 +0000
|
+++ configure.ac 2016-09-19 09:52:02.546258535 +0000
|
||||||
@@ -10123,8 +10123,8 @@ fi
|
@@ -1727,10 +1727,8 @@ fi
|
||||||
LD_SWITCH_X_SITE_RPATH=
|
LD_SWITCH_X_SITE_RPATH=
|
||||||
if test "${x_libraries}" != NONE; then
|
if test "${x_libraries}" != NONE; then
|
||||||
if test -n "${x_libraries}"; then
|
if test -n "${x_libraries}"; then
|
||||||
- LD_SWITCH_X_SITE=-L`echo ${x_libraries} | sed -e "s/:/ -L/g"`
|
- LD_SWITCH_X_SITE=-L`AS_ECHO(["$x_libraries"]) | sed -e 's/:/ -L/g'`
|
||||||
- LD_SWITCH_X_SITE_RPATH=-Wl,-rpath,`echo ${x_libraries} | sed -e "s/:/ -Wl,-rpath,/g"`
|
- LD_SWITCH_X_SITE_RPATH=-Wl,-rpath,`
|
||||||
|
- AS_ECHO(["$x_libraries"]) | sed -e 's/:/ -Wl,-rpath,/g'
|
||||||
|
- `
|
||||||
+ LD_SWITCH_X_SITE="-L ${x_libraries%%:*}"
|
+ LD_SWITCH_X_SITE="-L ${x_libraries%%:*}"
|
||||||
+ LD_SWITCH_X_SITE_RPATH="-Wl,-rpath-link,${x_libraries%%:*}"
|
+ LD_SWITCH_X_SITE_RPATH="-Wl,-rpath-link,${x_libraries%%:*}"
|
||||||
fi
|
fi
|
||||||
x_default_search_path=""
|
x_default_search_path=""
|
||||||
x_search_path=${x_libraries}
|
x_search_path=${x_libraries}
|
||||||
--- doc/man/etags.1
|
--- doc/man/etags.1
|
||||||
+++ doc/man/etags.1 2009-08-11 12:59:38.000000000 +0000
|
+++ doc/man/etags.1 2016-09-19 09:54:09.419906131 +0000
|
||||||
@@ -7,7 +7,7 @@
|
@@ -7,7 +7,7 @@
|
||||||
..
|
..
|
||||||
|
|
||||||
@ -90,16 +89,16 @@
|
|||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.hy 0
|
.hy 0
|
||||||
.na
|
.na
|
||||||
@@ -24,7 +24,7 @@ etags, ctags \- generate tag file for Em
|
@@ -25,7 +25,7 @@ etags, ctags \- generate tag file for Em
|
||||||
[\|\-\-help\|] [\|\-\-version\|]
|
[\|\-\-help\|] [\|\-\-version\|]
|
||||||
\fIfile\fP .\|.\|.
|
\fIfile\fP .\|.\|.
|
||||||
|
|
||||||
-\fBctags\fP [\|\-aCdgIRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
-\fBctags\fP [\|\-aCdgIQRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
||||||
+\fBgnuctags\fP [\|\-aCdgIRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
+\fBgnuctag\fP [\|\-aCdgIQRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
||||||
.if n .br
|
.if n .br
|
||||||
[\|\-o \fItagfile\fP\|] [\|\-r \fIregexp\fP\|]
|
[\|\-o \fItagfile\fP\|] [\|\-r \fIregexp\fP\|]
|
||||||
[\|\-\-parse\-stdin=\fIfile\fP\|]
|
[\|\-\-parse\-stdin=\fIfile\fP\|]
|
||||||
@@ -43,7 +43,7 @@ etags, ctags \- generate tag file for Em
|
@@ -45,7 +45,7 @@ etags, ctags \- generate tag file for Em
|
||||||
The \|\fBetags\fP\| program is used to create a tag table file, in a format
|
The \|\fBetags\fP\| program is used to create a tag table file, in a format
|
||||||
understood by
|
understood by
|
||||||
.BR emacs ( 1 )\c
|
.BR emacs ( 1 )\c
|
||||||
@ -108,7 +107,7 @@
|
|||||||
format understood by
|
format understood by
|
||||||
.BR vi ( 1 )\c
|
.BR vi ( 1 )\c
|
||||||
\&. Both forms of the program understand
|
\&. Both forms of the program understand
|
||||||
@@ -53,7 +53,7 @@ PHP, PostScript, Python, Prolog, Scheme
|
@@ -55,7 +55,7 @@ Ruby, PHP, PostScript, Python, Prolog, S
|
||||||
most assembler\-like syntaxes.
|
most assembler\-like syntaxes.
|
||||||
Both forms read the files specified on the command line, and write a tag
|
Both forms read the files specified on the command line, and write a tag
|
||||||
table (defaults: \fBTAGS\fP for \fBetags\fP, \fBtags\fP for
|
table (defaults: \fBTAGS\fP for \fBetags\fP, \fBtags\fP for
|
||||||
@ -117,7 +116,7 @@
|
|||||||
Files specified with relative file names will be recorded in the tag
|
Files specified with relative file names will be recorded in the tag
|
||||||
table with file names relative to the directory where the tag table
|
table with file names relative to the directory where the tag table
|
||||||
resides. If the tag table is in /dev or is the standard output,
|
resides. If the tag table is in /dev or is the standard output,
|
||||||
@@ -69,7 +69,7 @@ parsing of the file names following the
|
@@ -71,7 +71,7 @@ parsing of the file names following the
|
||||||
language, overriding guesses based on filename extensions.
|
language, overriding guesses based on filename extensions.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
Some options make sense only for the \fBvi\fP style tag files produced
|
Some options make sense only for the \fBvi\fP style tag files produced
|
||||||
@ -126,16 +125,16 @@
|
|||||||
\fBetags\fP does not recognize them.
|
\fBetags\fP does not recognize them.
|
||||||
The programs accept unambiguous abbreviations for long option names.
|
The programs accept unambiguous abbreviations for long option names.
|
||||||
.TP
|
.TP
|
||||||
@@ -83,7 +83,7 @@ expression search instructions; the \fB\
|
@@ -85,7 +85,7 @@ expression search instructions; the \fB\
|
||||||
the delimiter `\|\fB?\fP\|', to search \fIbackwards\fP through files.
|
the delimiter "\|\fB?\fP\|", to search \fIbackwards\fP through files.
|
||||||
The default is to use the delimiter `\|\fB/\fP\|', to search \fIforwards\fP
|
The default is to use the delimiter "\|\fB/\fP\|", to search \fIforwards\fP
|
||||||
through files.
|
through files.
|
||||||
-Only \fBctags\fP accepts this option.
|
-Only \fBctags\fP accepts this option.
|
||||||
+Only \fBgnuctags\fP accepts this option.
|
+Only \fBgnuctag\fP accepts this option.
|
||||||
.TP
|
.TP
|
||||||
.B \-\-declarations
|
.B \-\-declarations
|
||||||
In C and derived languages, create tags for function declarations,
|
In C and derived languages, create tags for function declarations,
|
||||||
@@ -158,7 +158,7 @@ the previous ones. The regexps are of o
|
@@ -174,7 +174,7 @@ the previous ones. The regexps are of o
|
||||||
where \fItagregexp\fP is used to match the tag. It should not match
|
where \fItagregexp\fP is used to match the tag. It should not match
|
||||||
useless characters. If the match is such that more characters than
|
useless characters. If the match is such that more characters than
|
||||||
needed are unavoidably matched by \fItagregexp\fP, it may be useful to
|
needed are unavoidably matched by \fItagregexp\fP, it may be useful to
|
||||||
@ -144,7 +143,7 @@
|
|||||||
ignores regexps without a \fInameregexp\fP. The syntax of regexps is
|
ignores regexps without a \fInameregexp\fP. The syntax of regexps is
|
||||||
the same as in emacs. The following character escape sequences are
|
the same as in emacs. The following character escape sequences are
|
||||||
supported: \\a, \\b, \\d, \\e, \\f, \\n, \\r, \\t, \\v, which
|
supported: \\a, \\b, \\d, \\e, \\f, \\n, \\r, \\t, \\v, which
|
||||||
@@ -237,15 +237,15 @@ tag entries for other files in place. C
|
@@ -253,15 +253,15 @@ tag entries for other files in place. C
|
||||||
by deleting the existing entries for the given files and then
|
by deleting the existing entries for the given files and then
|
||||||
rewriting the new entries at the end of the tags file. It is often
|
rewriting the new entries at the end of the tags file. It is often
|
||||||
faster to simply rebuild the entire tag file than to use this.
|
faster to simply rebuild the entire tag file than to use this.
|
||||||
@ -164,8 +163,8 @@
|
|||||||
.B \-h, \-H, \-\-help
|
.B \-h, \-H, \-\-help
|
||||||
Print usage information. Followed by one or more \-\-language=LANG
|
Print usage information. Followed by one or more \-\-language=LANG
|
||||||
--- lib-src/Makefile.in
|
--- lib-src/Makefile.in
|
||||||
+++ lib-src/Makefile.in 2014-10-21 14:25:38.807837913 +0000
|
+++ lib-src/Makefile.in 2016-09-19 09:56:30.249261196 +0000
|
||||||
@@ -118,7 +118,7 @@ MKDIR_P = @MKDIR_P@
|
@@ -150,7 +150,7 @@ MKDIR_P = @MKDIR_P@
|
||||||
CLIENTW = @CLIENTW@
|
CLIENTW = @CLIENTW@
|
||||||
|
|
||||||
# Things that a user might actually run, which should be installed in bindir.
|
# Things that a user might actually run, which should be installed in bindir.
|
||||||
@ -173,22 +172,18 @@
|
|||||||
+INSTALLABLES = etags${EXEEXT} gnuctags${EXEEXT} emacsclient${EXEEXT} $(CLIENTW) \
|
+INSTALLABLES = etags${EXEEXT} gnuctags${EXEEXT} emacsclient${EXEEXT} $(CLIENTW) \
|
||||||
ebrowse${EXEEXT}
|
ebrowse${EXEEXT}
|
||||||
|
|
||||||
INSTALLABLE_SCRIPTS = grep-changelog
|
# Things that Emacs runs internally, or during the build process,
|
||||||
@@ -331,10 +331,10 @@ ebrowse${EXEEXT}: ${srcdir}/ebrowse.c ${
|
@@ -367,7 +367,7 @@ etags${EXEEXT}: ${etags_deps}
|
||||||
|
|
||||||
## We depend on etags to assure that parallel makes do not write two
|
|
||||||
## etags.o files on top of each other.
|
## etags.o files on top of each other.
|
||||||
-ctags${EXEEXT}: etags${EXEEXT}
|
## FIXME?
|
||||||
+gnuctags${EXEEXT}: etags${EXEEXT}
|
## Can't we use a wrapper that calls 'etags --ctags'?
|
||||||
$(CC) ${ALL_CFLAGS} -DCTAGS -DEMACS_NAME="\"GNU Emacs\"" \
|
-ctags${EXEEXT}: ${srcdir}/ctags.c ${etags_deps}
|
||||||
-DVERSION="\"${version}\"" ${srcdir}/etags.c \
|
+gnuctags${EXEEXT}: ${srcdir}/ctags.c ${etags_deps}
|
||||||
- regex.o $(LOADLIBES) $(NTLIB) -o ctags${EXEEXT}
|
$(AM_V_CCLD)$(CC) ${ALL_CFLAGS} $(etags_cflags) $< $(etags_libs)
|
||||||
+ regex.o $(LOADLIBES) $(NTLIB) -o gnuctags${EXEEXT}
|
|
||||||
|
|
||||||
profile${EXEEXT}: ${srcdir}/profile.c $(NTLIB) $(config_h)
|
ebrowse${EXEEXT}: ${srcdir}/ebrowse.c ${srcdir}/../lib/min-max.h $(NTLIB) \
|
||||||
$(CC) ${ALL_CFLAGS} ${srcdir}/profile.c \
|
|
||||||
--- lib-src/pop.c
|
--- lib-src/pop.c
|
||||||
+++ lib-src/pop.c 2011-11-28 08:38:56.000000000 +0000
|
+++ lib-src/pop.c 2016-09-19 09:25:18.256204648 +0000
|
||||||
@@ -26,6 +26,7 @@ along with GNU Emacs. If not, see <http
|
@@ -26,6 +26,7 @@ along with GNU Emacs. If not, see <http
|
||||||
#ifdef MAIL_USE_POP
|
#ifdef MAIL_USE_POP
|
||||||
|
|
||||||
@ -198,7 +193,7 @@
|
|||||||
#include "ntlib.h"
|
#include "ntlib.h"
|
||||||
#include <winsock.h>
|
#include <winsock.h>
|
||||||
--- lisp/cmuscheme.el
|
--- lisp/cmuscheme.el
|
||||||
+++ lisp/cmuscheme.el 2009-08-12 13:29:47.000000000 +0000
|
+++ lisp/cmuscheme.el 2016-09-19 09:25:18.256204648 +0000
|
||||||
@@ -241,7 +241,8 @@ is run).
|
@@ -241,7 +241,8 @@ is run).
|
||||||
(read-string "Run Scheme: " scheme-program-name)
|
(read-string "Run Scheme: " scheme-program-name)
|
||||||
scheme-program-name)))
|
scheme-program-name)))
|
||||||
@ -210,8 +205,8 @@
|
|||||||
(scheme-start-file (car cmdlist)) (cdr cmdlist)))
|
(scheme-start-file (car cmdlist)) (cdr cmdlist)))
|
||||||
(inferior-scheme-mode)))
|
(inferior-scheme-mode)))
|
||||||
--- lisp/international/mule-cmds.el
|
--- lisp/international/mule-cmds.el
|
||||||
+++ lisp/international/mule-cmds.el 2010-10-18 14:06:48.000000000 +0000
|
+++ lisp/international/mule-cmds.el 2016-09-19 09:25:18.256204648 +0000
|
||||||
@@ -41,6 +41,7 @@
|
@@ -39,6 +39,7 @@
|
||||||
|
|
||||||
(defvar mule-keymap
|
(defvar mule-keymap
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
@ -220,8 +215,8 @@
|
|||||||
(define-key map "r" 'revert-buffer-with-coding-system)
|
(define-key map "r" 'revert-buffer-with-coding-system)
|
||||||
(define-key map "F" 'set-file-name-coding-system)
|
(define-key map "F" 'set-file-name-coding-system)
|
||||||
--- lisp/net/ange-ftp.el
|
--- lisp/net/ange-ftp.el
|
||||||
+++ lisp/net/ange-ftp.el 2009-08-12 13:35:06.000000000 +0000
|
+++ lisp/net/ange-ftp.el 2016-09-19 09:25:18.256204648 +0000
|
||||||
@@ -4977,7 +4977,7 @@ NEWNAME should be the name to give the n
|
@@ -4985,7 +4985,7 @@ NEWNAME should be the name to give the n
|
||||||
; "If a host matches this regexp then it is assumed to be running VOS.")
|
; "If a host matches this regexp then it is assumed to be running VOS.")
|
||||||
;
|
;
|
||||||
;(defun ange-ftp-vos-host (host)
|
;(defun ange-ftp-vos-host (host)
|
||||||
@ -230,7 +225,7 @@
|
|||||||
; (save-match-data
|
; (save-match-data
|
||||||
; (string-match ange-ftp-vos-host-regexp host))))
|
; (string-match ange-ftp-vos-host-regexp host))))
|
||||||
;
|
;
|
||||||
@@ -5092,7 +5092,7 @@ NEWNAME should be the name to give the n
|
@@ -5100,7 +5100,7 @@ NEWNAME should be the name to give the n
|
||||||
|
|
||||||
;; Return non-nil if HOST is running VMS.
|
;; Return non-nil if HOST is running VMS.
|
||||||
(defun ange-ftp-vms-host (host)
|
(defun ange-ftp-vms-host (host)
|
||||||
@ -239,7 +234,7 @@
|
|||||||
(string-match-p ange-ftp-vms-host-regexp host)))
|
(string-match-p ange-ftp-vms-host-regexp host)))
|
||||||
|
|
||||||
;; Because some VMS ftp servers convert filenames to lower case
|
;; Because some VMS ftp servers convert filenames to lower case
|
||||||
@@ -5600,7 +5600,7 @@ Other orders of $ and _ seem to all work
|
@@ -5608,7 +5608,7 @@ Other orders of $ and _ seem to all work
|
||||||
|
|
||||||
;; Return non-nil if HOST is running MTS.
|
;; Return non-nil if HOST is running MTS.
|
||||||
(defun ange-ftp-mts-host (host)
|
(defun ange-ftp-mts-host (host)
|
||||||
@ -248,7 +243,7 @@
|
|||||||
(string-match-p ange-ftp-mts-host-regexp host)))
|
(string-match-p ange-ftp-mts-host-regexp host)))
|
||||||
|
|
||||||
;; Parse the current buffer which is assumed to be in mts ftp dir format.
|
;; Parse the current buffer which is assumed to be in mts ftp dir format.
|
||||||
@@ -5798,7 +5798,7 @@ Other orders of $ and _ seem to all work
|
@@ -5806,7 +5806,7 @@ Other orders of $ and _ seem to all work
|
||||||
|
|
||||||
;; Return non-nil if HOST is running CMS.
|
;; Return non-nil if HOST is running CMS.
|
||||||
(defun ange-ftp-cms-host (host)
|
(defun ange-ftp-cms-host (host)
|
||||||
@ -258,7 +253,7 @@
|
|||||||
|
|
||||||
(defun ange-ftp-add-cms-host (host)
|
(defun ange-ftp-add-cms-host (host)
|
||||||
--- lisp/site-load.el
|
--- lisp/site-load.el
|
||||||
+++ lisp/site-load.el 2013-05-21 15:51:52.000000000 +0000
|
+++ lisp/site-load.el 2016-09-19 09:25:18.256204648 +0000
|
||||||
@@ -0,0 +1,41 @@
|
@@ -0,0 +1,41 @@
|
||||||
+;;;;
|
+;;;;
|
||||||
+;;; emacs20.xx/lisp/site-load.el
|
+;;; emacs20.xx/lisp/site-load.el
|
||||||
@ -302,8 +297,8 @@
|
|||||||
+
|
+
|
||||||
+;;; site-load.el ends here
|
+;;; site-load.el ends here
|
||||||
--- lisp/speedbar.el
|
--- lisp/speedbar.el
|
||||||
+++ lisp/speedbar.el 2012-06-27 11:04:53.000000000 +0000
|
+++ lisp/speedbar.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -806,6 +806,7 @@ If you want to change this while speedba
|
@@ -794,6 +794,7 @@ If you want to change this while speedba
|
||||||
|
|
||||||
;; Navigation.
|
;; Navigation.
|
||||||
(define-key map "n" 'speedbar-next)
|
(define-key map "n" 'speedbar-next)
|
||||||
@ -312,7 +307,7 @@
|
|||||||
(define-key map "\M-n" 'speedbar-restricted-next)
|
(define-key map "\M-n" 'speedbar-restricted-next)
|
||||||
(define-key map "\M-p" 'speedbar-restricted-prev)
|
(define-key map "\M-p" 'speedbar-restricted-prev)
|
||||||
--- lisp/textmodes/ispell.el
|
--- lisp/textmodes/ispell.el
|
||||||
+++ lisp/textmodes/ispell.el 2014-10-21 14:26:54.515839767 +0000
|
+++ lisp/textmodes/ispell.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -351,10 +351,12 @@ Must be greater than 1."
|
@@ -351,10 +351,12 @@ Must be greater than 1."
|
||||||
:group 'ispell)
|
:group 'ispell)
|
||||||
|
|
||||||
@ -330,7 +325,7 @@
|
|||||||
"Program invoked by \\[ispell-word] and \\[ispell-region] commands."
|
"Program invoked by \\[ispell-word] and \\[ispell-region] commands."
|
||||||
:type 'string
|
:type 'string
|
||||||
:set (lambda (symbol value)
|
:set (lambda (symbol value)
|
||||||
@@ -1473,6 +1475,56 @@ The variable `ispell-library-directory'
|
@@ -1525,6 +1527,56 @@ The variable `ispell-library-directory'
|
||||||
(if ispell-menu-map-needed
|
(if ispell-menu-map-needed
|
||||||
(progn
|
(progn
|
||||||
(setq ispell-menu-map (make-sparse-keymap "Spell"))
|
(setq ispell-menu-map (make-sparse-keymap "Spell"))
|
||||||
@ -388,7 +383,7 @@
|
|||||||
`(menu-item ,(purecopy "Change Dictionary...") ispell-change-dictionary
|
`(menu-item ,(purecopy "Change Dictionary...") ispell-change-dictionary
|
||||||
:help ,(purecopy "Supply explicit dictionary file name")))
|
:help ,(purecopy "Supply explicit dictionary file name")))
|
||||||
--- site-lisp/term/func-keys.el
|
--- site-lisp/term/func-keys.el
|
||||||
+++ site-lisp/term/func-keys.el 2013-05-21 15:51:52.000000000 +0000
|
+++ site-lisp/term/func-keys.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -0,0 +1,33 @@
|
@@ -0,0 +1,33 @@
|
||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;;; term/func-keys.el for site-lisp path
|
+;;; term/func-keys.el for site-lisp path
|
||||||
@ -424,7 +419,7 @@
|
|||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;; Ende von func-keys.el
|
+;; Ende von func-keys.el
|
||||||
--- site-lisp/term/gnome.el
|
--- site-lisp/term/gnome.el
|
||||||
+++ site-lisp/term/gnome.el 2013-05-21 15:51:52.000000000 +0000
|
+++ site-lisp/term/gnome.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -0,0 +1,97 @@
|
@@ -0,0 +1,97 @@
|
||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;;; term/gnomw.el for site-lisp path
|
+;;; term/gnomw.el for site-lisp path
|
||||||
@ -524,7 +519,7 @@
|
|||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;; Ende von gnomw.el
|
+;; Ende von gnomw.el
|
||||||
--- site-lisp/term/kvt.el
|
--- site-lisp/term/kvt.el
|
||||||
+++ site-lisp/term/kvt.el 2013-05-21 15:51:52.000000000 +0000
|
+++ site-lisp/term/kvt.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -0,0 +1,97 @@
|
@@ -0,0 +1,97 @@
|
||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;;; term/kvt.el for site-lisp path
|
+;;; term/kvt.el for site-lisp path
|
||||||
@ -624,7 +619,7 @@
|
|||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;; Ende von kvt.el
|
+;; Ende von kvt.el
|
||||||
--- site-lisp/term/linux.el
|
--- site-lisp/term/linux.el
|
||||||
+++ site-lisp/term/linux.el 2013-05-21 15:51:52.000000000 +0000
|
+++ site-lisp/term/linux.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -0,0 +1,79 @@
|
@@ -0,0 +1,79 @@
|
||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;;; term/linux.el for site-lisp path
|
+;;; term/linux.el for site-lisp path
|
||||||
@ -706,7 +701,7 @@
|
|||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;; Ende von linux.el
|
+;; Ende von linux.el
|
||||||
--- site-lisp/term/locale.el
|
--- site-lisp/term/locale.el
|
||||||
+++ site-lisp/term/locale.el 2013-05-21 15:51:52.000000000 +0000
|
+++ site-lisp/term/locale.el 2016-09-19 09:25:18.260204572 +0000
|
||||||
@@ -0,0 +1,13 @@
|
@@ -0,0 +1,13 @@
|
||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;;; term/locale.el for site-lisp path
|
+;;; term/locale.el for site-lisp path
|
||||||
@ -721,14 +716,3 @@
|
|||||||
+;;
|
+;;
|
||||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
+;; Ende von locale.el
|
+;; Ende von locale.el
|
||||||
--- src/lisp.mk
|
|
||||||
+++ src/lisp.mk 2014-10-21 14:27:53.832337794 +0000
|
|
||||||
@@ -151,6 +151,8 @@ lisp = \
|
|
||||||
$(lispsource)/w32-vars.elc \
|
|
||||||
$(lispsource)/term/w32-win.elc \
|
|
||||||
$(lispsource)/ls-lisp.elc \
|
|
||||||
+ $(lispsource)/lpr.elc \
|
|
||||||
+ $(lispsource)/delsel.elc \
|
|
||||||
$(lispsource)/disp-table.elc \
|
|
||||||
$(lispsource)/w32-common-fns.elc \
|
|
||||||
$(lispsource)/dos-w32.elc \
|
|
3
emacs-25.1.tar.xz
Normal file
3
emacs-25.1.tar.xz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:19f2798ee3bc26c95dca3303e7ab141e7ad65d6ea2b6945eeba4dbea7df48f33
|
||||||
|
size 42498944
|
@ -1,3 +1,79 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Nov 11 09:01:36 UTC 2016 - werner@suse.de
|
||||||
|
|
||||||
|
- Avoid address space randomization during emacs build
|
||||||
|
- Check for active Execution Shield as this breaks emacs
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Sep 21 06:31:44 UTC 2016 - werner@suse.de
|
||||||
|
|
||||||
|
- Diable experimental cairo support as it cause trouble with spacemacs
|
||||||
|
as well as with the w3 mode
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 19 15:01:07 UTC 2016 - werner@suse.de
|
||||||
|
|
||||||
|
- Update to emacs version 25.1
|
||||||
|
* Next major release
|
||||||
|
* Xwidgets: a new feature for embedding native widgets inside Emacs buffers.
|
||||||
|
* Emacs can now load shared/dynamic libraries (modules).
|
||||||
|
* Network security (TLS/SSL certificate validity and the like)
|
||||||
|
* 'C-h l' now also lists the commands that were run.
|
||||||
|
* New option 'switch-to-buffer-in-dedicated-window'
|
||||||
|
* The option 'even-window-heights' has been renamed to 'even-window-sizes'
|
||||||
|
* 'terpri' gets an optional arg ENSURE to conditionally output a newline.
|
||||||
|
* 'insert-register' now leaves point after the inserted text
|
||||||
|
* The new variable 'term-file-aliases' replaces some files from lisp/term.
|
||||||
|
* New variable 'system-configuration-features', listing some of the main
|
||||||
|
features that Emacs was compiled with.
|
||||||
|
* A password is now hidden also when typed in batch mode.
|
||||||
|
* The Emacs pseudo-random number generator can be securely seeded.
|
||||||
|
* New input methods: 'tamil-dvorak', 'programmer-dvorak' and 'probhat'.
|
||||||
|
* 'M-x' suggests shorthands and ignores obsolete commands for completion.
|
||||||
|
* Changes in undo
|
||||||
|
* New command 'comment-line' bound to 'C-x C-;'.
|
||||||
|
* New and improved facilities for inserting Unicode characters
|
||||||
|
* New minor mode 'global-eldoc-mode' is enabled by default.
|
||||||
|
* Emacs now uses "bracketed paste mode" on text terminals that support it.
|
||||||
|
* Emacs now supports the latest version of the UBA.
|
||||||
|
* You can access 'mouse-buffer-menu' ('C-down-mouse-1') using 'C-f10'.
|
||||||
|
* New buffer-local 'electric-pair-local-mode'.
|
||||||
|
* New variable 'fast-but-imprecise-scrolling' inhibits fontification
|
||||||
|
during full screen scrolling operations.
|
||||||
|
* New documentation command 'describe-symbol'.
|
||||||
|
* New function 'custom-prompt-customize-unsaved-options' checks for
|
||||||
|
unsaved customizations and prompts user to customize (if found).
|
||||||
|
* The old 'C-x w' bindings in 'hi-lock-mode' are officially deprecated
|
||||||
|
* New function 'bookmark-set-no-overwrite' bound to 'C-x r M'.
|
||||||
|
* Many other details, see /usr/share/emacs/25.1/etc/NEWS
|
||||||
|
- Patch emacs-24.4.dif renamed to emacs-25.1.dif
|
||||||
|
- Patches removed as now upstream or fixed otherwise
|
||||||
|
debbugs16737.patch
|
||||||
|
emacs-24-0010-ELF-unexec-Correct-section-header-index.patch
|
||||||
|
emacs-24-0011-ELF-unexec-Tidy-code.patch
|
||||||
|
emacs-24-0012-ELF-unexec-Merge-Alpha-and-MIPS-COFF-debug-handling.patch
|
||||||
|
emacs-24-0013-ELF-unexec-Symbol-table-patching.patch
|
||||||
|
emacs-24-0014-ELF-unexec-_OBJC_-symbols-in-bss-sections.patch
|
||||||
|
emacs-24-0015-ELF-unexec-R_-_NONE-relocs.patch
|
||||||
|
emacs-24-0016-ELF-unexec-Drive-from-PT_LOAD-header-rather-than-sec.patch
|
||||||
|
emacs-24-0017-ELF-unexec-Don-t-insert-a-new-section.patch
|
||||||
|
emacs-24-0018-src-unexelf.c-NEW_PROGRAM_H-Remove-unused-macro-Bug-.patch
|
||||||
|
emacs-24-0019-ELF-unexec-align-section-header.patch
|
||||||
|
emacs-24-fix-missing-gtk-icons.patch
|
||||||
|
emacs-24.4-bzr118021.patch
|
||||||
|
emacs24-primarysel2.patch
|
||||||
|
gmalloc.patch
|
||||||
|
- Patches forwarded to 25.1
|
||||||
|
emacs-24.1-ps-mule.patch
|
||||||
|
emacs-24.3-asian-print.patch
|
||||||
|
emacs-24.3-iconic.patch
|
||||||
|
emacs-24.3-x11r7.patch
|
||||||
|
emacs-24.4-flyspell.patch
|
||||||
|
emacs-24.4-glibc.patch
|
||||||
|
emacs-24.4-nonvoid.patch
|
||||||
|
emacs-24.4-ps-bdf.patch
|
||||||
|
emacs-24.4-xim.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Sep 9 13:21:33 UTC 2016 - zaitor@opensuse.org
|
Fri Sep 9 13:21:33 UTC 2016 - zaitor@opensuse.org
|
||||||
|
|
||||||
|
4
emacs.sh
4
emacs.sh
@ -26,7 +26,9 @@ if test "$EMACS_TOOLKIT" = gtk; then
|
|||||||
# Currently (2013/05/24) the parser of the GNOME libs
|
# Currently (2013/05/24) the parser of the GNOME libs
|
||||||
# are broken that is it is not independent from locale
|
# are broken that is it is not independent from locale
|
||||||
LC_NUMERIC=POSIX
|
LC_NUMERIC=POSIX
|
||||||
export LC_NUMERIC
|
XLIB_SKIP_ARGB_VISUALS=1
|
||||||
|
GDK_RGBA=0
|
||||||
|
export LC_NUMERIC XLIB_SKIP_ARGB_VISUALS GDK_RGBA
|
||||||
fi
|
fi
|
||||||
arg0=$0
|
arg0=$0
|
||||||
argv=("$@")
|
argv=("$@")
|
||||||
|
324
emacs.spec
324
emacs.spec
File diff suppressed because it is too large
Load Diff
@ -1,14 +0,0 @@
|
|||||||
diff --git a/lisp/mouse.el b/lisp/mouse.el
|
|
||||||
index e267418..2afe313 100644
|
|
||||||
--- a/lisp/mouse.el
|
|
||||||
+++ b/lisp/mouse.el
|
|
||||||
@@ -856,7 +856,8 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
|
|
||||||
(copy-region-as-kill (mark) (point)))))
|
|
||||||
|
|
||||||
;; Otherwise, run binding of terminating up-event.
|
|
||||||
- (deactivate-mark)
|
|
||||||
+ (let (select-active-regions)
|
|
||||||
+ (deactivate-mark))
|
|
||||||
(if do-multi-click
|
|
||||||
(goto-char start-point)
|
|
||||||
(unless moved-off-start
|
|
113
gmalloc.patch
113
gmalloc.patch
@ -1,113 +0,0 @@
|
|||||||
Index: emacs-24.5/src/emacs.c
|
|
||||||
===================================================================
|
|
||||||
--- emacs-24.5.orig/src/emacs.c
|
|
||||||
+++ emacs-24.5/src/emacs.c
|
|
||||||
@@ -723,6 +723,26 @@ main (int argc, char **argv)
|
|
||||||
stack_base = &dummy;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#if defined HAVE_PERSONALITY_LINUX32 && defined __PPC64__
|
|
||||||
+ /* This code partly duplicates the HAVE_PERSONALITY_LINUX32 code
|
|
||||||
+ below. This duplication is planned to be fixed in a later
|
|
||||||
+ Emacs release. */
|
|
||||||
+# define ADD_NO_RANDOMIZE 0x0040000
|
|
||||||
+ int pers = personality (0xffffffff);
|
|
||||||
+ if (! (pers & ADD_NO_RANDOMIZE)
|
|
||||||
+ && 0 <= personality (pers | ADD_NO_RANDOMIZE))
|
|
||||||
+ {
|
|
||||||
+ /* Address randomization was enabled, but is now disabled.
|
|
||||||
+ Re-execute Emacs to get a clean slate. */
|
|
||||||
+ execvp (argv[0], argv);
|
|
||||||
+
|
|
||||||
+ /* If the exec fails, warn the user and then try without a
|
|
||||||
+ clean slate. */
|
|
||||||
+ perror (argv[0]);
|
|
||||||
+ }
|
|
||||||
+# undef ADD_NO_RANDOMIZE
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#ifdef G_SLICE_ALWAYS_MALLOC
|
|
||||||
/* This is used by the Cygwin build. It's not needed starting with
|
|
||||||
cygwin-1.7.24, but it doesn't do any harm. */
|
|
||||||
@@ -833,7 +853,7 @@ main (int argc, char **argv)
|
|
||||||
dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0
|
|
||||||
|| strcmp (argv[argc - 1], "bootstrap") == 0);
|
|
||||||
|
|
||||||
-#ifdef HAVE_PERSONALITY_LINUX32
|
|
||||||
+#if defined HAVE_PERSONALITY_LINUX32 && !defined __PPC64__
|
|
||||||
if (dumping && ! getenv ("EMACS_HEAP_EXEC"))
|
|
||||||
{
|
|
||||||
/* Set this so we only do this once. */
|
|
||||||
@@ -850,7 +870,7 @@ main (int argc, char **argv)
|
|
||||||
/* If the exec fails, try to dump anyway. */
|
|
||||||
emacs_perror (argv[0]);
|
|
||||||
}
|
|
||||||
-#endif /* HAVE_PERSONALITY_LINUX32 */
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
|
|
||||||
/* Extend the stack space available.
|
|
||||||
Index: emacs-24.5/src/gmalloc.c
|
|
||||||
===================================================================
|
|
||||||
--- emacs-24.5.orig/src/gmalloc.c
|
|
||||||
+++ emacs-24.5/src/gmalloc.c
|
|
||||||
@@ -42,6 +42,16 @@ License along with this library. If not
|
|
||||||
extern void emacs_abort (void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+#undef malloc
|
|
||||||
+#undef realloc
|
|
||||||
+#undef calloc
|
|
||||||
+#undef free
|
|
||||||
+#define malloc gmalloc
|
|
||||||
+#define realloc grealloc
|
|
||||||
+#define calloc gcalloc
|
|
||||||
+#define aligned_alloc galigned_alloc
|
|
||||||
+#define free gfree
|
|
||||||
+
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
@@ -1747,6 +1757,42 @@ valloc (size_t size)
|
|
||||||
return aligned_alloc (pagesize, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
+#undef malloc
|
|
||||||
+#undef realloc
|
|
||||||
+#undef calloc
|
|
||||||
+#undef aligned_alloc
|
|
||||||
+#undef free
|
|
||||||
+
|
|
||||||
+void *
|
|
||||||
+malloc (size_t size)
|
|
||||||
+{
|
|
||||||
+ return gmalloc (size);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void *
|
|
||||||
+calloc (size_t nmemb, size_t size)
|
|
||||||
+{
|
|
||||||
+ return gcalloc (nmemb, size);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+free (void *ptr)
|
|
||||||
+{
|
|
||||||
+ gfree (ptr);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void *
|
|
||||||
+aligned_alloc (size_t alignment, size_t size)
|
|
||||||
+{
|
|
||||||
+ return galigned_alloc (alignment, size);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void *
|
|
||||||
+realloc (void *ptr, size_t size)
|
|
||||||
+{
|
|
||||||
+ return grealloc (ptr, size);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
#ifdef GC_MCHECK
|
|
||||||
|
|
||||||
/* Standard debugging hooks for `malloc'.
|
|
Loading…
x
Reference in New Issue
Block a user