mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-08 00:33:13 -08:00
Fix crash when built by GNU Gold linker on x86
Problem reported by Andrés Musetti (Bug#27248). * src/widget.c (emacsFrameClassRec): Do not initialize superclass here. (emacsFrameClass): Now a function (which initializes the superclass) instead of a variable. All uses changed.
This commit is contained in:
parent
6fcbbc393e
commit
fb45f7075a
4 changed files with 24 additions and 5 deletions
|
|
@ -576,7 +576,17 @@ unexec (const char *new_name, const char *old_name)
|
|||
}
|
||||
|
||||
/* This loop seeks out relocation sections for the data section, so
|
||||
that it can undo relocations performed by the runtime loader. */
|
||||
that it can undo relocations performed by the runtime loader.
|
||||
|
||||
The following approach does not work on x86 platforms that use
|
||||
the GNU Gold linker, which can generate .rel.dyn relocation
|
||||
sections containing R_386_32 entries that the following code does
|
||||
not grok. Emacs works around this problem by avoiding C
|
||||
constructs that generate such entries, which is horrible hack.
|
||||
|
||||
FIXME: Presumably more problems like this will crop up as linkers
|
||||
get fancier. We really need to stop assuming that Emacs can grok
|
||||
arbitrary linker output. See Bug#27248. */
|
||||
for (n = new_file_h->e_shnum; 0 < --n; )
|
||||
{
|
||||
ElfW (Shdr) *rel_shdr = &NEW_SECTION_H (n);
|
||||
|
|
|
|||
13
src/widget.c
13
src/widget.c
|
|
@ -108,7 +108,7 @@ emacsFrameTranslations [] = "\
|
|||
|
||||
static EmacsFrameClassRec emacsFrameClassRec = {
|
||||
{ /* core fields */
|
||||
/* superclass */ &widgetClassRec,
|
||||
/* superclass */ 0, /* filled in by emacsFrameClass */
|
||||
/* class_name */ (char *) "EmacsFrame",
|
||||
/* widget_size */ sizeof (EmacsFrameRec),
|
||||
/* class_initialize */ 0,
|
||||
|
|
@ -146,7 +146,16 @@ static EmacsFrameClassRec emacsFrameClassRec = {
|
|||
}
|
||||
};
|
||||
|
||||
WidgetClass emacsFrameClass = (WidgetClass) &emacsFrameClassRec;
|
||||
WidgetClass
|
||||
emacsFrameClass (void)
|
||||
{
|
||||
/* Set the superclass here rather than relying on static
|
||||
initialization, to work around an unexelf.c bug on x86 platforms
|
||||
that use the GNU Gold linker (Bug#27248). */
|
||||
emacsFrameClassRec.core_class.superclass = &widgetClassRec;
|
||||
|
||||
return (WidgetClass) &emacsFrameClassRec;
|
||||
}
|
||||
|
||||
static void
|
||||
get_default_char_pixel_size (EmacsFrame ew, int *pixel_width, int *pixel_height)
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
typedef struct _EmacsFrameRec *EmacsFrame;
|
||||
typedef struct _EmacsFrameClassRec *EmacsFrameClass;
|
||||
|
||||
extern WidgetClass emacsFrameClass;
|
||||
extern WidgetClass emacsFrameClass (void);
|
||||
|
||||
extern struct _DisplayContext *display_context;
|
||||
|
||||
|
|
|
|||
|
|
@ -2875,7 +2875,7 @@ x_window (struct frame *f, long window_prompting)
|
|||
XtSetArg (al[ac], XtNdepth, FRAME_DISPLAY_INFO (f)->n_planes); ac++;
|
||||
XtSetArg (al[ac], XtNcolormap, FRAME_X_COLORMAP (f)); ac++;
|
||||
XtSetArg (al[ac], XtNborderWidth, 0); ac++;
|
||||
frame_widget = XtCreateWidget (f->namebuf, emacsFrameClass, pane_widget,
|
||||
frame_widget = XtCreateWidget (f->namebuf, emacsFrameClass (), pane_widget,
|
||||
al, ac);
|
||||
|
||||
f->output_data.x->edit_widget = frame_widget;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue