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
|
||||
|
||||
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
|
||||
|
||||
|
@ -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 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
|
||||
|
||||
(defconst ps-mule-font-info-database-latin
|
||||
@ -10,8 +15,8 @@
|
||||
"Sample setting of `ps-mule-font-info-database' to use latin fonts.")
|
||||
|
||||
--- lisp/textmodes/ispell.el
|
||||
+++ lisp/textmodes/ispell.el 2012-06-26 16:37:56.424010429 +0000
|
||||
@@ -1339,10 +1339,18 @@ Protects against bogus binding of `enabl
|
||||
+++ lisp/textmodes/ispell.el 2016-09-19 09:01:56.930605125 +0000
|
||||
@@ -1709,10 +1709,18 @@ Protects against bogus binding of `enabl
|
||||
nil ;; in pipe mode. Disable extended-char-mode
|
||||
(nth 6 (or (assoc ispell-current-dictionary ispell-local-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 2009-08-10 16:18:24.585901695 +0000
|
||||
@@ -239,7 +239,7 @@ Currently, data for Japanese and Korean
|
||||
+++ lisp/ps-mule.el 2016-09-19 08:57:28.807664990 +0000
|
||||
@@ -264,7 +264,7 @@ Currently, data for Japanese and Korean
|
||||
(japanese-jisx0208
|
||||
(normal bdf "jiskan24.bdf"))
|
||||
(korean-ksc5601
|
||||
|
@ -1,6 +1,10 @@
|
||||
---
|
||||
lisp/startup.el | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- lisp/startup.el
|
||||
+++ lisp/startup.el 2008-03-31 10:23:04.503065574 +0000
|
||||
@@ -2171,6 +2171,9 @@ A fancy display is used on graphic displ
|
||||
+++ 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))
|
||||
|
||||
|
@ -1,5 +1,9 @@
|
||||
---
|
||||
src/xrdb.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
--- 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
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xutil.h>
|
||||
@ -10,7 +14,7 @@
|
||||
#ifdef HAVE_PWD_H
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
@@ -539,6 +542,15 @@ x_load_resources (Display *display, cons
|
||||
@@ -496,6 +499,15 @@ x_load_resources (Display *display, cons
|
||||
XrmPutLineResource (&rdb, line);
|
||||
|
||||
#endif /* not USE_MOTIF */
|
||||
@ -26,7 +30,7 @@
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -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(-)
|
||||
|
||||
--- lisp/textmodes/flyspell.el
|
||||
+++ lisp/textmodes/flyspell.el 2014-10-21 14:14:59.191838679 +0000
|
||||
@@ -286,6 +286,12 @@ If this variable is nil, all regions are
|
||||
+++ lisp/textmodes/flyspell.el 2016-09-19 09:22:48.535025631 +0000
|
||||
@@ -287,6 +287,12 @@ If this variable is nil, all regions are
|
||||
:type 'key-sequence
|
||||
:group 'flyspell)
|
||||
|
||||
@ -17,15 +17,15 @@
|
||||
;;*---------------------------------------------------------------------*/
|
||||
;;* 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 -------------------------------------------------------*/
|
||||
(put 'mail-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
|
||||
(put 'message-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
|
||||
-(defvar message-signature-separator)
|
||||
(defun mail-mode-flyspell-verify ()
|
||||
"Function used for `flyspell-generic-check-word-predicate' in Mail mode."
|
||||
(let ((header-end (save-excursion
|
||||
@@ -321,11 +326,11 @@ property of the major mode name.")
|
||||
(let* ((header-end (save-excursion
|
||||
@@ -322,11 +327,11 @@ property of the major mode name.")
|
||||
nil t)
|
||||
(point)))
|
||||
(signature-begin
|
||||
@ -34,8 +34,8 @@
|
||||
(point-max)
|
||||
(save-excursion
|
||||
(goto-char (point-max))
|
||||
- (re-search-backward message-signature-separator nil t)
|
||||
+ (re-search-backward flyspell-signature-separator nil t)
|
||||
- (re-search-backward message-signature-separator
|
||||
+ (re-search-backward flyspell-signature-separator
|
||||
(max header-end (- (point) 4000)) t)
|
||||
(point)))))
|
||||
(cond ((< (point) header-end)
|
||||
(and (save-excursion (beginning-of-line)
|
||||
|
@ -1,30 +1,25 @@
|
||||
---
|
||||
configure | 2 ++
|
||||
configure.ac | 2 ++
|
||||
lib-src/Makefile.in | 6 ++++--
|
||||
3 files changed, 8 insertions(+), 2 deletions(-)
|
||||
configure | 1 +
|
||||
configure.ac | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
Index: configure
|
||||
===================================================================
|
||||
--- configure.orig
|
||||
+++ configure
|
||||
@@ -10951,6 +10951,7 @@ fi
|
||||
--- configure.ac
|
||||
+++ configure.ac 2016-09-19 08:54:17.383277267 +0000
|
||||
@@ -2203,6 +2203,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 ;;
|
||||
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 ;;
|
||||
cygwin|mingw32|freebsd|irix6-5) use_mmap_for_buffers=yes ;;
|
||||
+ gnu-linux) use_mmap_for_buffers=yes ;;
|
||||
esac
|
||||
|
||||
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/emacs-module.c | 1 +
|
||||
src/xmenu.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
--- src/xmenu.c
|
||||
+++ src/xmenu.c 2014-10-21 14:06:22.923837970 +0000
|
||||
@@ -2031,8 +2031,8 @@ Lisp_Object
|
||||
+++ src/xmenu.c 2016-09-19 09:01:56.930605125 +0000
|
||||
@@ -1922,8 +1922,8 @@ Lisp_Object
|
||||
xw_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents)
|
||||
{
|
||||
Lisp_Object title;
|
||||
@ -15,3 +16,13 @@
|
||||
ptrdiff_t specpdl_count = SPECPDL_INDEX ();
|
||||
|
||||
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(-)
|
||||
|
||||
--- lisp/ldefs-boot.el
|
||||
+++ lisp/ldefs-boot.el 2015-04-30 13:03:34.058018924 +0000
|
||||
@@ -21554,9 +21554,9 @@ With prefix argument ARG, restart the Pr
|
||||
;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (21710 25077 708662 334000))
|
||||
+++ lisp/ldefs-boot.el 2016-09-19 09:01:36.090998408 +0000
|
||||
@@ -22107,9 +22107,9 @@ With prefix argument ARG, restart the Pr
|
||||
;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (22388 5707 728611 808000))
|
||||
;;; 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/share/fonts/bdf")) "\
|
||||
List of directories to search for `BDF' font files.
|
||||
-The default value is '(\"/usr/local/share/emacs/fonts/bdf\").")
|
||||
+The default value is '(\"/usr/share/fonts/bdf\").")
|
||||
-The default value is (\"/usr/local/share/emacs/fonts/bdf\").")
|
||||
+The default value is (\"/usr/share/fonts/bdf\").")
|
||||
|
||||
(custom-autoload 'bdf-directory-list "ps-bdf" t)
|
||||
|
||||
--- 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 @@
|
||||
(defcustom bdf-directory-list
|
||||
(if (memq system-type '(ms-dos windows-nt))
|
||||
@ -26,8 +26,8 @@
|
||||
- '("/usr/local/share/emacs/fonts/bdf"))
|
||||
+ '("/usr/share/fonts/bdf"))
|
||||
"List of directories to search for `BDF' font files.
|
||||
-The default value is '(\"/usr/local/share/emacs/fonts/bdf\")."
|
||||
+The default value is '(\"/usr/share/fonts/bdf\")."
|
||||
-The default value is (\"/usr/local/share/emacs/fonts/bdf\")."
|
||||
+The default value is (\"/usr/share/fonts/bdf\")."
|
||||
:type '(repeat :tag "BDF font directory list"
|
||||
(directory :tag "BDF font directory"))
|
||||
:group 'ps-print-miscellany)
|
||||
|
@ -3,8 +3,8 @@
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- src/xfns.c
|
||||
+++ src/xfns.c 2014-10-21 14:09:49.520338231 +0000
|
||||
@@ -1648,8 +1648,8 @@ static XIMStyle best_xim_style (XIMStyle
|
||||
+++ src/xfns.c 2016-09-19 09:10:35.504833294 +0000
|
||||
@@ -1957,8 +1957,8 @@ static XIMStyle best_xim_style (XIMStyle
|
||||
|
||||
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 +---
|
||||
configure | 4 -
|
||||
configure.ac | 4 -
|
||||
Makefile.in | 7 +-
|
||||
configure | 6 --
|
||||
configure.ac | 6 --
|
||||
doc/man/etags.1 | 20 ++++----
|
||||
lib-src/Makefile.in | 6 +-
|
||||
lib-src/Makefile.in | 4 -
|
||||
lib-src/pop.c | 1
|
||||
lisp/cmuscheme.el | 3 -
|
||||
lisp/international/mule-cmds.el | 1
|
||||
@ -16,35 +16,30 @@
|
||||
site-lisp/term/kvt.el | 97 ++++++++++++++++++++++++++++++++++++++++
|
||||
site-lisp/term/linux.el | 79 ++++++++++++++++++++++++++++++++
|
||||
site-lisp/term/locale.el | 13 +++++
|
||||
src/lisp.mk | 2
|
||||
18 files changed, 448 insertions(+), 33 deletions(-)
|
||||
17 files changed, 445 insertions(+), 32 deletions(-)
|
||||
|
||||
--- Makefile.in
|
||||
+++ Makefile.in 2014-10-21 14:24:43.751837432 +0000
|
||||
@@ -490,12 +490,8 @@ install-arch-dep: src install-arch-indep
|
||||
libexecdir="${libexecdir}" archlibdir="${archlibdir}" \
|
||||
INSTALL_STRIP=${INSTALL_STRIP}
|
||||
if test "${ns_self_contained}" = "no"; then \
|
||||
- ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACSFULL)" || exit 1 ; \
|
||||
- chmod 1755 "$(DESTDIR)${bindir}/$(EMACSFULL)" || true; \
|
||||
- if test "x${NO_BIN_LINK}" = x; then \
|
||||
- rm -f "$(DESTDIR)${bindir}/$(EMACS)" ; \
|
||||
- cd "$(DESTDIR)${bindir}" && $(LN_S_FILEONLY) $(EMACSFULL) $(EMACS); \
|
||||
- fi; \
|
||||
+ ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} $(DESTDIR)${bindir}/$(EMACS) || exit 1 ; \
|
||||
+ chmod 1755 $(DESTDIR)${bindir}/$(EMACS) || true; \
|
||||
else \
|
||||
subdir=${ns_appresdir}/site-lisp; \
|
||||
${write_subdir} || exit 1; \
|
||||
@@ -684,6 +680,7 @@ install-man:
|
||||
+++ Makefile.in 2016-09-19 09:49:37.296950020 +0000
|
||||
@@ -493,8 +493,8 @@ install-arch-dep: src install-arch-indep
|
||||
umask 022; ${MKDIR_P} "$(DESTDIR)${bindir}"
|
||||
$(MAKE) -C lib-src install
|
||||
ifeq (${ns_self_contained},no)
|
||||
- ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACSFULL)"
|
||||
- -chmod 755 "$(DESTDIR)${bindir}/$(EMACSFULL)"
|
||||
+ ${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACS)"
|
||||
+ -chmod 755 "$(DESTDIR)${bindir}/$(EMACS)"
|
||||
ifndef NO_BIN_LINK
|
||||
rm -f "$(DESTDIR)${bindir}/$(EMACS)"
|
||||
cd "$(DESTDIR)${bindir}" && $(LN_S_FILEONLY) $(EMACSFULL) $(EMACS)
|
||||
@@ -683,6 +683,7 @@ install-man:
|
||||
umask 022; ${MKDIR_P} "$(DESTDIR)${man1dir}"
|
||||
thisdir=`/bin/pwd`; \
|
||||
cd ${mansrcdir}; \
|
||||
+ cp ctags.1 gnuctags.1; \
|
||||
for page in *.1; do \
|
||||
test "$$page" = ChangeLog.1 && continue; \
|
||||
dest=`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1; \
|
||||
(cd "$${thisdir}"; \
|
||||
@@ -770,7 +767,7 @@ uninstall: uninstall-$(NTDIR) uninstall-
|
||||
@@ -771,7 +772,7 @@ uninstall: uninstall-$(NTDIR) uninstall-
|
||||
for page in *.1; do \
|
||||
rm -f "$(DESTDIR)${man1dir}"/`echo "$${page}" | sed -e 's/\.1$$//' -e '$(TRANSFORM)'`.1$$ext; done; \
|
||||
fi)
|
||||
@ -53,34 +48,38 @@
|
||||
(if cd "$(DESTDIR)${icondir}"; then \
|
||||
rm -f hicolor/*x*/apps/${EMACS_NAME}.png \
|
||||
hicolor/scalable/apps/${EMACS_NAME}.svg \
|
||||
--- configure.ac
|
||||
+++ configure.ac 2013-05-21 16:02:45.000000000 +0000
|
||||
@@ -1595,8 +1595,8 @@ fi
|
||||
--- configure
|
||||
+++ configure 2016-09-19 09:53:00.097191627 +0000
|
||||
@@ -10749,10 +10749,8 @@ fi
|
||||
LD_SWITCH_X_SITE_RPATH=
|
||||
if test "${x_libraries}" != NONE; then
|
||||
if test -n "${x_libraries}"; then
|
||||
- LD_SWITCH_X_SITE=-L`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=-L`$as_echo "$x_libraries" | sed -e 's/:/ -L/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_RPATH="-Wl,-rpath-link,${x_libraries%%:*}"
|
||||
fi
|
||||
x_default_search_path=""
|
||||
x_search_path=${x_libraries}
|
||||
--- configure
|
||||
+++ configure 2013-05-21 16:02:54.000000000 +0000
|
||||
@@ -10123,8 +10123,8 @@ fi
|
||||
--- configure.ac
|
||||
+++ configure.ac 2016-09-19 09:52:02.546258535 +0000
|
||||
@@ -1727,10 +1727,8 @@ fi
|
||||
LD_SWITCH_X_SITE_RPATH=
|
||||
if test "${x_libraries}" != NONE; then
|
||||
if test -n "${x_libraries}"; then
|
||||
- LD_SWITCH_X_SITE=-L`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=-L`AS_ECHO(["$x_libraries"]) | sed -e 's/:/ -L/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_RPATH="-Wl,-rpath-link,${x_libraries%%:*}"
|
||||
fi
|
||||
x_default_search_path=""
|
||||
x_search_path=${x_libraries}
|
||||
--- 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 @@
|
||||
..
|
||||
|
||||
@ -90,16 +89,16 @@
|
||||
.SH SYNOPSIS
|
||||
.hy 0
|
||||
.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\|]
|
||||
\fIfile\fP .\|.\|.
|
||||
|
||||
-\fBctags\fP [\|\-aCdgIRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
||||
+\fBgnuctags\fP [\|\-aCdgIRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
||||
-\fBctags\fP [\|\-aCdgIQRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
||||
+\fBgnuctag\fP [\|\-aCdgIQRVh\|] [\|\-BtTuvwx\|] [\|\-l \fIlanguage\fP\|]
|
||||
.if n .br
|
||||
[\|\-o \fItagfile\fP\|] [\|\-r \fIregexp\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
|
||||
understood by
|
||||
.BR emacs ( 1 )\c
|
||||
@ -108,7 +107,7 @@
|
||||
format understood by
|
||||
.BR vi ( 1 )\c
|
||||
\&. 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.
|
||||
Both forms read the files specified on the command line, and write a tag
|
||||
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
|
||||
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,
|
||||
@@ -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.
|
||||
.SH OPTIONS
|
||||
Some options make sense only for the \fBvi\fP style tag files produced
|
||||
@ -126,16 +125,16 @@
|
||||
\fBetags\fP does not recognize them.
|
||||
The programs accept unambiguous abbreviations for long option names.
|
||||
.TP
|
||||
@@ -83,7 +83,7 @@ expression search instructions; the \fB\
|
||||
the delimiter `\|\fB?\fP\|', to search \fIbackwards\fP through files.
|
||||
The default is to use the delimiter `\|\fB/\fP\|', to search \fIforwards\fP
|
||||
@@ -85,7 +85,7 @@ expression search instructions; the \fB\
|
||||
the delimiter "\|\fB?\fP\|", to search \fIbackwards\fP through files.
|
||||
The default is to use the delimiter "\|\fB/\fP\|", to search \fIforwards\fP
|
||||
through files.
|
||||
-Only \fBctags\fP accepts this option.
|
||||
+Only \fBgnuctags\fP accepts this option.
|
||||
+Only \fBgnuctag\fP accepts this option.
|
||||
.TP
|
||||
.B \-\-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
|
||||
useless characters. If the match is such that more characters than
|
||||
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
|
||||
the same as in emacs. The following character escape sequences are
|
||||
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
|
||||
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.
|
||||
@ -164,8 +163,8 @@
|
||||
.B \-h, \-H, \-\-help
|
||||
Print usage information. Followed by one or more \-\-language=LANG
|
||||
--- lib-src/Makefile.in
|
||||
+++ lib-src/Makefile.in 2014-10-21 14:25:38.807837913 +0000
|
||||
@@ -118,7 +118,7 @@ MKDIR_P = @MKDIR_P@
|
||||
+++ lib-src/Makefile.in 2016-09-19 09:56:30.249261196 +0000
|
||||
@@ -150,7 +150,7 @@ MKDIR_P = @MKDIR_P@
|
||||
CLIENTW = @CLIENTW@
|
||||
|
||||
# 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) \
|
||||
ebrowse${EXEEXT}
|
||||
|
||||
INSTALLABLE_SCRIPTS = grep-changelog
|
||||
@@ -331,10 +331,10 @@ ebrowse${EXEEXT}: ${srcdir}/ebrowse.c ${
|
||||
|
||||
## We depend on etags to assure that parallel makes do not write two
|
||||
# Things that Emacs runs internally, or during the build process,
|
||||
@@ -367,7 +367,7 @@ etags${EXEEXT}: ${etags_deps}
|
||||
## etags.o files on top of each other.
|
||||
-ctags${EXEEXT}: etags${EXEEXT}
|
||||
+gnuctags${EXEEXT}: etags${EXEEXT}
|
||||
$(CC) ${ALL_CFLAGS} -DCTAGS -DEMACS_NAME="\"GNU Emacs\"" \
|
||||
-DVERSION="\"${version}\"" ${srcdir}/etags.c \
|
||||
- regex.o $(LOADLIBES) $(NTLIB) -o ctags${EXEEXT}
|
||||
+ regex.o $(LOADLIBES) $(NTLIB) -o gnuctags${EXEEXT}
|
||||
## FIXME?
|
||||
## Can't we use a wrapper that calls 'etags --ctags'?
|
||||
-ctags${EXEEXT}: ${srcdir}/ctags.c ${etags_deps}
|
||||
+gnuctags${EXEEXT}: ${srcdir}/ctags.c ${etags_deps}
|
||||
$(AM_V_CCLD)$(CC) ${ALL_CFLAGS} $(etags_cflags) $< $(etags_libs)
|
||||
|
||||
profile${EXEEXT}: ${srcdir}/profile.c $(NTLIB) $(config_h)
|
||||
$(CC) ${ALL_CFLAGS} ${srcdir}/profile.c \
|
||||
ebrowse${EXEEXT}: ${srcdir}/ebrowse.c ${srcdir}/../lib/min-max.h $(NTLIB) \
|
||||
--- 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
|
||||
#ifdef MAIL_USE_POP
|
||||
|
||||
@ -198,7 +193,7 @@
|
||||
#include "ntlib.h"
|
||||
#include <winsock.h>
|
||||
--- 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).
|
||||
(read-string "Run Scheme: " scheme-program-name)
|
||||
scheme-program-name)))
|
||||
@ -210,8 +205,8 @@
|
||||
(scheme-start-file (car cmdlist)) (cdr cmdlist)))
|
||||
(inferior-scheme-mode)))
|
||||
--- lisp/international/mule-cmds.el
|
||||
+++ lisp/international/mule-cmds.el 2010-10-18 14:06:48.000000000 +0000
|
||||
@@ -41,6 +41,7 @@
|
||||
+++ lisp/international/mule-cmds.el 2016-09-19 09:25:18.256204648 +0000
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
(defvar mule-keymap
|
||||
(let ((map (make-sparse-keymap)))
|
||||
@ -220,8 +215,8 @@
|
||||
(define-key map "r" 'revert-buffer-with-coding-system)
|
||||
(define-key map "F" 'set-file-name-coding-system)
|
||||
--- lisp/net/ange-ftp.el
|
||||
+++ lisp/net/ange-ftp.el 2009-08-12 13:35:06.000000000 +0000
|
||||
@@ -4977,7 +4977,7 @@ NEWNAME should be the name to give the n
|
||||
+++ lisp/net/ange-ftp.el 2016-09-19 09:25:18.256204648 +0000
|
||||
@@ -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.")
|
||||
;
|
||||
;(defun ange-ftp-vos-host (host)
|
||||
@ -230,7 +225,7 @@
|
||||
; (save-match-data
|
||||
; (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.
|
||||
(defun ange-ftp-vms-host (host)
|
||||
@ -239,7 +234,7 @@
|
||||
(string-match-p ange-ftp-vms-host-regexp host)))
|
||||
|
||||
;; 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.
|
||||
(defun ange-ftp-mts-host (host)
|
||||
@ -248,7 +243,7 @@
|
||||
(string-match-p ange-ftp-mts-host-regexp host)))
|
||||
|
||||
;; 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.
|
||||
(defun ange-ftp-cms-host (host)
|
||||
@ -258,7 +253,7 @@
|
||||
|
||||
(defun ange-ftp-add-cms-host (host)
|
||||
--- 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 @@
|
||||
+;;;;
|
||||
+;;; emacs20.xx/lisp/site-load.el
|
||||
@ -302,8 +297,8 @@
|
||||
+
|
||||
+;;; site-load.el ends here
|
||||
--- lisp/speedbar.el
|
||||
+++ lisp/speedbar.el 2012-06-27 11:04:53.000000000 +0000
|
||||
@@ -806,6 +806,7 @@ If you want to change this while speedba
|
||||
+++ lisp/speedbar.el 2016-09-19 09:25:18.260204572 +0000
|
||||
@@ -794,6 +794,7 @@ If you want to change this while speedba
|
||||
|
||||
;; Navigation.
|
||||
(define-key map "n" 'speedbar-next)
|
||||
@ -312,7 +307,7 @@
|
||||
(define-key map "\M-n" 'speedbar-restricted-next)
|
||||
(define-key map "\M-p" 'speedbar-restricted-prev)
|
||||
--- 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."
|
||||
:group 'ispell)
|
||||
|
||||
@ -330,7 +325,7 @@
|
||||
"Program invoked by \\[ispell-word] and \\[ispell-region] commands."
|
||||
:type 'string
|
||||
: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
|
||||
(progn
|
||||
(setq ispell-menu-map (make-sparse-keymap "Spell"))
|
||||
@ -388,7 +383,7 @@
|
||||
`(menu-item ,(purecopy "Change Dictionary...") ispell-change-dictionary
|
||||
:help ,(purecopy "Supply explicit dictionary file name")))
|
||||
--- 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 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;;; term/func-keys.el for site-lisp path
|
||||
@ -424,7 +419,7 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;; Ende von func-keys.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 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;;; term/gnomw.el for site-lisp path
|
||||
@ -524,7 +519,7 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;; Ende von gnomw.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 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;;; term/kvt.el for site-lisp path
|
||||
@ -624,7 +619,7 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;; Ende von kvt.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 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;;; term/linux.el for site-lisp path
|
||||
@ -706,7 +701,7 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;; Ende von linux.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 @@
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;;; term/locale.el for site-lisp path
|
||||
@ -721,14 +716,3 @@
|
||||
+;;
|
||||
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
+;; 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
|
||||
|
||||
|
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
|
||||
# are broken that is it is not independent from locale
|
||||
LC_NUMERIC=POSIX
|
||||
export LC_NUMERIC
|
||||
XLIB_SKIP_ARGB_VISUALS=1
|
||||
GDK_RGBA=0
|
||||
export LC_NUMERIC XLIB_SKIP_ARGB_VISUALS GDK_RGBA
|
||||
fi
|
||||
arg0=$0
|
||||
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