This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

binutils-2.8 ld segmentation fault




I've stumbled across a segmentation violation in ld when I try to
link for PowerPc using ld. I've cut the job down to a very simple file
which still causes a SIGSEGV. Anybody have any ideas as why and a fix?
(I'll try to figure out what hold_use is for, and hack around it).

Any ideas???

- -- 
Peter Barada				pbarada@wavemark.com
Wizard					617-270-7098 x1226
WaveMark Technologies, Inc.		617-270-0193 (fax)

"Real men know that you should never attempt to accomplish with words
what you can do with a flame thrower" --Bruce Ferstein


/* the code fragment from ld/ee32ppc.c: */

gldelf32ppc_place_section (s)
     lang_statement_union_type *s;
{
  lang_output_section_statement_type *os;

  if (s->header.type != lang_output_section_statement_enum)
    return;

  os = &s->output_section_statement;

  if (strcmp (os->name, hold_section->name) == 0
      && ((hold_section->flags & (SEC_LOAD | SEC_ALLOC))
	  == (os->bfd_section->flags & (SEC_LOAD | SEC_ALLOC)))) /* <--- */
    hold_use = os;

/* ... */

os->bfd_section is null, so a dereference of it to get flags causes a
SIGSEGV.

- --- confid.status:

#!/bin/sh
# This file was generated automatically by configure.  Do not edit.
# This directory was configured as follows:
./configure --target=ppc-rtems-eabi --prefix=/usr/local/wave \
 --exec-prefix=/usr/local/wave/ppc --program-prefix=ppc_ --host=i586-linux-gnu --nfp
#

- --- link.cmd:

SECTIONS {
  .text : {}
  .data : {}
  .bss : {}
}

- --- Makefile:

CC= ppc_gcc
AS= ppc_as
LD= ppc_ld
AR= ppc_ar

CFLAGS=  -c -g -D__ppc
CFLAGS1=  -S -g -mcpu=403
INCLUDES = -I $(PPC_PATH)/include

AFLAGS=

LFLAGS=	-T link.cmd
LIBFLAGS=

.s.o:
	$(AS) -mregnames -o $*.o $*.s

all: simple.elf


clean:
	rm -f *.o *.elf *.srec *.map *.dis *.out *.lst *.i

OFILES = simple.o

simple.elf:	$(OFILES)
	$(LD) $(LFLAGS) -o simple.elf $(OFILES) $(LIBFLAGS) -Map simple.map

real_simple.elf: $(OFILES)
	$(LD)  -o real_simple.elf $(OFILES) $(LIBFLAGS) -Map real_simple.map

- --- simple.s:

    .text
	.align		4

	.globl		START, _START, _boot, _start, _theend


START:
_START:
_boot:
_start:	
    ori r3, r3, 42
    b $
_theend:

- --- gdb.dump:


(gdb) run
Starting program: /usr/local/wave/ppc/bin/ppc_ld -T link.cmd -o simple.elf simple.o  -Map simple.map
warning: Unable to find dynamic linker breakpoint function.
warning: GDB will be unable to debug shared library initializers
warning: and track explicitly loaded dynamic code.

Program received signal SIGSEGV, Segmentation fault.
0x8057229 in gldelf32ppc_place_section (s=0x80ad460) at eelf32ppc.c:794
(gdb) up
#1  0x804e00f in lang_for_each_statement_worker (
    func=0x80571f0 <gldelf32ppc_place_section>, s=0x80ad3c8) at ldlang.c:188
(gdb) down
#0  0x8057229 in gldelf32ppc_place_section (s=0x80ad460) at eelf32ppc.c:794
(gdb) where
#0  0x8057229 in gldelf32ppc_place_section (s=0x80ad460) at eelf32ppc.c:794
#1  0x804e00f in lang_for_each_statement_worker (
    func=0x80571f0 <gldelf32ppc_place_section>, s=0x80ad3c8) at ldlang.c:188
#2  0x804e0cd in lang_for_each_statement (
    func=0x80571f0 <gldelf32ppc_place_section>) at ldlang.c:232
#3  0x8056e83 in gldelf32ppc_place_orphan (file=0x80ad564, s=0x80b7d98)
    at eelf32ppc.c:634
#4  0x8054e50 in ldemul_place_orphan (file=0x80ad564, s=0x80b7d98)
    at ldemul.c:131
#5  0x80507fa in lang_place_orphans () at ldlang.c:2806
#6  0x8050b59 in lang_process () at ldlang.c:3108
#7  0x8052402 in main (argc=8, argv=0xbffff9e0) at ldmain.c:313
#8  0x80493fb in _start ()
(gdb) p *os
$1 = {header = {next = 0x80ad4cc, type = lang_output_section_statement_enum}, 
  addr_tree = 0x0, children = {head = 0x0, tail = 0x80ad46c}, memspec = 0x0, 
  next = 0x80ad4cc, name = 0x80b1840 ".text", processed = false, 
  bfd_section = 0x0, flags = 0, sectype = normal_section, region = 0x80ad4ac, 
  block_value = 1, fill = 0, subsection_alignment = -1, 
  section_alignment = -1, load_base = 0x0, phdrs = 0x0}
(gdb) p os->bfd_section
$2 = (asection *) 0x0
(gdb)