This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] gas/config/tc-score7.c: Use symbol_get_frag() instead of direct reference to fix segment fault issue
- From: Chen Gang <gang dot chen dot 5i5j at gmail dot com>
- To: Andreas Schwab <schwab at linux-m68k dot org>, amodra at gmail dot com, matthew dot fortune at imgtec dot com, nickc at redhat dot com, Pedro Alves <palves at redhat dot com>
- Cc: binutils at sourceware dot org
- Date: Wed, 11 Jun 2014 10:45:20 +0800
- Subject: Re: [PATCH] gas/config/tc-score7.c: Use symbol_get_frag() instead of direct reference to fix segment fault issue
- Authentication-results: sourceware.org; auth=none
- References: <5393ECFE dot 8080806 at gmail dot com>
Hello Maintainers:
Is it patch OK? please help check when you have free time, thanks.
Originally, I could not find the related Changelog for 'gas', so I did
not mark change log for it.
BTW: After fix this issue, binutiles and gcc can generated score-elf-*
to compile Linux upstream kernel. And now it can compile Linux upstream
kernel successfully! :-)
Thanks.
On 06/08/2014 12:56 PM, Chen Gang wrote:
> If 'symbol' is 'local_symbol' and already local_symbol_converted_p(),
> caller has to use symbol_get_frag() instead of direct reference to get
> 'frag', or may use invalid pointer to cause segment fault.
>
> The related assembly file for score is below, and related statement is
> "beq .L10".
>
> .file "conftest.c"
> .text
> .align 2
> .globl foo
> .LFB0:
> .ent foo
> foo:
> .frame r2,24,r3, 0 # vars= 4, regs= 4, args= 4, gp= 0
> .mask 0x0000300c,-4
> sw r13, [r0,-4]+
> .LCFI0:
> sw r12, [r0,-4]+
> .LCFI1:
> sw r3, [r0,-4]+
> .LCFI2:
> sw r2, [r0,-4]+
> .LCFI3:
> addi r0, -8
> .LCFI4:
> mv! r2, r0
> .LCFI5:
> .LEHB0:
> jl bar
> .LEHE0:
> ldiu! r12, 1
> .L5:
> addri r6, r2, 4
> mv! r4, r6
> .LEHB1:
> jl clean
> cmpi.c r12, 1
> beq .L10
> j .L9
> .L6:
> mv! r13, r4
> ldiu! r12, 0
> j .L5
> .L9:
> mv! r6, r13
> mv! r4, r6
> jl _Unwind_Resume
> .LEHE1:
> .L10:
> #nop!
> addi r2, 8
> mv! r0, r2
> lw r2, [r0]+, 4
> lw r3, [r0]+, 4
> lw r12, [r0]+, 4
> lw r13, [r0]+, 4
> br! r3
> .end foo
> .LFE0:
> .globl __gcc_personality_v0
> .section .gcc_except_table,"aw",@progbits
> .LLSDA0:
> .byte 0xff
> .byte 0xff
> .byte 0x3
> .byte 0x1a
> .4byte .LEHB0-.LFB0
> .4byte .LEHE0-.LEHB0
> .4byte .L6-.LFB0
> .byte 0
> .4byte .LEHB1-.LFB0
> .4byte .LEHE1-.LEHB1
> .4byte 0
> .byte 0
> .text
> .size foo, .-foo
> .section .eh_frame,"aw",@progbits
> .Lframe1:
> .4byte .LECIE1-.LSCIE1
> .LSCIE1:
> .4byte 0
> .byte 0x3
> .string "zPL"
> .byte 0x1
> .byte 0x7c
> .byte 0x3
> .byte 0x6
> .byte 0
> .4byte __gcc_personality_v0
> .byte 0
> .byte 0xc
> .byte 0
> .byte 0
> .align 2
> .LECIE1:
> .LSFDE1:
> .4byte .LEFDE1-.LASFDE1
> .LASFDE1:
> .4byte .LASFDE1-.Lframe1
> .4byte .LFB0
> .4byte .LFE0-.LFB0
> .byte 0x4
> .4byte .LLSDA0
> .byte 0x4
> .4byte .LCFI0-.LFB0
> .byte 0xe
> .byte 0x4
> .byte 0x8d
> .byte 0x1
> .byte 0x4
> .4byte .LCFI1-.LCFI0
> .byte 0xe
> .byte 0x8
> .byte 0x8c
> .byte 0x2
> .byte 0x4
> .4byte .LCFI2-.LCFI1
> .byte 0xe
> .byte 0xc
> .byte 0x83
> .byte 0x3
> .byte 0x4
> .4byte .LCFI3-.LCFI2
> .byte 0xe
> .byte 0x10
> .byte 0x82
> .byte 0x4
> .byte 0x4
> .4byte .LCFI4-.LCFI3
> .byte 0xe
> .byte 0x18
> .byte 0x4
> .4byte .LCFI5-.LCFI4
> .byte 0xd
> .byte 0x2
> .align 2
> .LEFDE1:
> .ident "GCC: (GNU) 4.10.0 20140530 (experimental)"
>
>
> Signed-off-by: Chen Gang <gang.chen.5i5j@gmail.com>
> ---
> gas/config/tc-score7.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/gas/config/tc-score7.c b/gas/config/tc-score7.c
> index 0a0db2d..8b4206d 100644
> --- a/gas/config/tc-score7.c
> +++ b/gas/config/tc-score7.c
> @@ -5264,7 +5264,7 @@ s7_b32_relax_to_b16 (fragS * fragp)
> else
> {
> if (s->bsym != 0)
> - symbol_address = (addressT) s->sy_frag->fr_address;
> + symbol_address = (addressT) symbol_get_frag(s)->fr_address;
> }
>
> value = s7_md_chars_to_number (fragp->fr_literal, s7_INSN_SIZE);
>
--
Chen Gang
Open, share, and attitude like air, water, and life which God blessed