From 12022d90dd3adc9f37dc2b16358cbecfe3c5be1c Mon Sep 17 00:00:00 2001 From: Samuli Suominen 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 Signed-off-by: Erik de Castro Lopo --- src/libFLAC/ia32/bitreader_asm.nasm | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/libFLAC/ia32/bitreader_asm.nasm b/src/libFLAC/ia32/bitreader_asm.nasm index c6bb8c2f..4cd0ea28 100644 --- a/src/libFLAC/ia32/bitreader_asm.nasm +++ b/src/libFLAC/ia32/bitreader_asm.nasm @@ -139,8 +139,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap mov eax, [ebp + 24] ; ax <- br->read_crc (a.k.a. crc) %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[] @@ -215,8 +220,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap mov eax, [ebp + 24] ; ax <- br->read_crc (a.k.a. crc) %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[] @@ -315,8 +325,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap push ebp ; /* push br argument */ %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 */ @@ -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; @@ -437,8 +459,13 @@ cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap mov eax, [ebp + 24] ; ax <- br->read_crc (a.k.a. crc) %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[]