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:
Dominique Leuenberger 2016-12-03 17:25:03 +00:00 committed by Git OBS Bridge
commit 29285a68e3
31 changed files with 473 additions and 3666 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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. */

View File

@ -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 */

View File

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

View File

@ -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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 GCCs -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++)

View File

@ -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

View File

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

View File

@ -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

View File

@ -1,12 +1,16 @@
---
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
((equal argi "-no-splash")
(setq inhibit-startup-screen t))
+++ lisp/startup.el 2016-09-19 09:15:26.871345783 +0000
@@ -2349,6 +2349,9 @@ nil default-directory" name)
((equal argi "-no-splash")
(setq inhibit-startup-screen t))
+ ((equal argi "-iconic")
+ (setq inhibit-startup-message t))
+ ((equal argi "-iconic")
+ (setq inhibit-startup-message t))
+
((member argi '("-f" ; what the manual claims
"-funcall"
"-e")) ; what the source used to say
((member argi '("-f" ; what the manual claims
"-funcall"
"-e")) ; what the source used to say

View File

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

View File

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

View File

@ -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,25 +17,25 @@
;;*---------------------------------------------------------------------*/
;;* 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.")
nil t)
(point)))
(signature-begin
- (if (not (boundp 'message-signature-separator))
+ (if (not (boundp 'flyspell-signature-separator))
(point-max)
(save-excursion
(goto-char (point-max))
- (re-search-backward message-signature-separator nil t)
+ (re-search-backward flyspell-signature-separator nil t)
(point)))))
(let* ((header-end (save-excursion
@@ -322,11 +327,11 @@ property of the major mode name.")
nil t)
(point)))
(signature-begin
- (if (not (boundp 'message-signature-separator))
+ (if (not (boundp 'flyspell-signature-separator))
(point-max)
(save-excursion
(goto-char (point-max))
- (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)

View File

@ -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

View File

@ -1,10 +1,11 @@
---
src/xmenu.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
src/emacs-module.c | 1 +
src/xmenu.c | 4 ++--
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;
}

View File

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

View File

@ -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[] =
{

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dd47d71dd2a526cf6b47cb49af793ec2e26af69a0951cc40e43ae290eacfc34e
size 39759804

View File

@ -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
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:19f2798ee3bc26c95dca3303e7ab141e7ad65d6ea2b6945eeba4dbea7df48f33
size 42498944

View File

@ -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

View File

@ -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=("$@")

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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'.