Upstream-Status: Backport
Signed-off-by: Ross Burton <ross.burton@intel.com>

From 12022d90dd3adc9f37dc2b16358cbecfe3c5be1c Mon Sep 17 00:00:00 2001
From: Samuli Suominen <drac@gentoo.org>
Date: Sun, 15 Jul 2012 15:45:10 +1000
Subject: [PATCH] Fix assembler code to make it PIC so the dynamic linker does
 not have to do text relocations on-the-fly. Patch from Gentoo
 via Jaren Stangret <sirjaren@gmail.com>

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
---
 src/libFLAC/ia32/bitreader_asm.nasm |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/src/libFLAC/ia32/bitreader_asm.nasm b/src/libFLAC/ia32/bitreader_asm.nasm
index c6bb8c2..4cd0ea2 100644
--- a/src/libFLAC/ia32/bitreader_asm.nasm
+++ b/src/libFLAC/ia32/bitreader_asm.nasm
@@ -140,8 +140,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
 %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
 	mov	edi, _FLAC__crc16_table
 %else
+%ifdef OBJ_FORMAT_elf
+	mov	edi, [esp + 16]		;		saved ebx (GOT base)
+	lea	edi, [edi + FLAC__crc16_table wrt ..gotoff]
+%else
 	mov	edi, FLAC__crc16_table
 %endif
+%endif
 	;; eax (ax)	crc a.k.a. br->read_crc
 	;; ebx (bl)	intermediate result index into FLAC__crc16_table[]
 	;; ecx		br->crc16_align
@@ -216,8 +221,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
 %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
 	mov	edi, _FLAC__crc16_table
 %else
+%ifdef OBJ_FORMAT_elf
+	mov	edi, [esp + 16]		;		saved ebx (GOT base)
+	lea	edi, [edi + FLAC__crc16_table wrt ..gotoff]
+%else
 	mov	edi, FLAC__crc16_table
 %endif
+%endif
 	;; eax (ax)	crc a.k.a. br->read_crc
 	;; ebx (bl)	intermediate result index into FLAC__crc16_table[]
 	;; ecx		br->crc16_align
@@ -316,8 +326,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
 %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
 	call	_bitreader_read_from_client_
 %else
+%ifdef OBJ_FORMAT_elf
+	mov	ebx, [esp + 20]		;		saved ebx (GOT base)
+	call	bitreader_read_from_client_ wrt ..plt
+%else
 	call	bitreader_read_from_client_
 %endif
+%endif
 	pop	edx			;     /* discard, unused */
 	pop	ecx			;     /* restore */
 	mov	esi, [ebp + 16]		;     cwords = br->consumed_words;
@@ -363,13 +378,20 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
 	mov	[ebp + 16], esi		;       br->consumed_words = cwords;
 	mov	[ebp + 20], ecx		;       br->consumed_bits = cbits;
 	push	ecx			;       /* save */
+	push	ebx			;       /* save */
 	push	ebp			;       /* push br argument */
 %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
 	call	_bitreader_read_from_client_
 %else
+%ifdef OBJ_FORMAT_elf
+	mov	ebx, [esp + 24]		;		saved ebx (GOT base)
+	call	bitreader_read_from_client_ wrt ..plt
+%else
 	call	bitreader_read_from_client_
 %endif
+%endif
 	pop	edx			;       /* discard, unused */
+	pop	ebx			;       /* restore */
 	pop	ecx			;       /* restore */
 	mov	esi, [ebp + 16]		;       cwords = br->consumed_words;
 					;       ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits;
@@ -438,8 +460,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
 %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
 	mov	edi, _FLAC__crc16_table
 %else
+%ifdef OBJ_FORMAT_elf
+	mov	edi, [esp + 24]		;		saved ebx (GOT base)
+	lea	edi, [edi + FLAC__crc16_table wrt ..gotoff]
+%else
 	mov	edi, FLAC__crc16_table
 %endif
+%endif
 	;; eax (ax)	crc a.k.a. br->read_crc
 	;; ebx (bl)	intermediate result index into FLAC__crc16_table[]
 	;; ecx		br->crc16_align
-- 
1.7.2.5

