diff -aur libdv-0.104/libdv/encode_x86_64.S libdv-0.104-patched/libdv/encode_x86_64.S
--- libdv-0.104/libdv/encode_x86_64.S	2004-11-17 03:36:30.000000000 +0000
+++ libdv-0.104-patched/libdv/encode_x86_64.S	2004-12-10 07:53:12.000000000 +0000
@@ -47,7 +47,8 @@
 
 	mov	$63, %rcx                        # loop counter
 
-	mov	vlc_encode_lookup(%rip), %r11
+	mov	vlc_encode_lookup@GOTPCREL(%rip), %r11
+	mov	(%r11),%r11
 
 	pxor	%mm0, %mm0
 	pxor	%mm2, %mm2
@@ -129,7 +130,8 @@
 	add	$2, %rdi           /* skip the DC coefficient */
 	mov	$63, %rcx
 
-	mov	vlc_num_bits_lookup(%rip), %r11
+	mov	vlc_num_bits_lookup@GOTPCREL(%rip), %r11
+	mov	(%r11),%r11
 	
 vlc_num_bits_block_x86_loop:
 	movw	(%rdi), %ax        /* get the next coeffiecient */
diff -aur libdv-0.104/libdv/idct_block_mmx_x86_64.S libdv-0.104-patched/libdv/idct_block_mmx_x86_64.S
--- libdv-0.104/libdv/idct_block_mmx_x86_64.S	2004-10-20 04:49:24.000000000 +0100
+++ libdv-0.104-patched/libdv/idct_block_mmx_x86_64.S	2004-12-10 07:38:23.000000000 +0000
@@ -22,7 +22,7 @@
 /* void _dv_idct_88(dv_coeff_t *block) */
 	/* argument block=rdi */
 	
-	lea	 preSC(%rip), %r11
+	mov	 preSC@GOTPCREL(%rip), %r11
 
 /* 
  *	column 0: even part
diff -aur libdv-0.104/libdv/quant_x86_64.S libdv-0.104-patched/libdv/quant_x86_64.S
--- libdv-0.104/libdv/quant_x86_64.S	2004-11-17 03:36:30.000000000 +0000
+++ libdv-0.104-patched/libdv/quant_x86_64.S	2004-12-10 07:36:42.000000000 +0000
@@ -73,10 +73,10 @@
 	/*  pq = dv_quant_shifts[qno + dv_quant_offset[class]]; */
 	mov	%rsi,%rax	/* qno */
 	mov	%rdx,%r12	/* class */
-	lea	dv_quant_offset(%rip),%rcx
+	mov	dv_quant_offset@GOTPCREL(%rip),%rcx
 	movzbq	(%rcx,%r12,1),%rcx   /* dv_quant_offset[class] */
 	add	%rcx,%rax                       /* qno + */
-	lea	dv_quant_shifts(%rip),%r11
+	mov	dv_quant_shifts@GOTPCREL(%rip),%r11
 	lea	(%r11,%rax,4),%r11	/* r11 is pq = dv_quant_shifts[...] */
 
 	/* extra = (class == 3); */
@@ -217,10 +217,10 @@
 	mov	%rsi,%rax	/* qno */
 	mov	%rdx,%r12	/* class */
 
-	lea	dv_quant_offset(%rip),%rcx
+	mov	dv_quant_offset@GOTPCREL(%rip),%rcx
 	movzbq	(%rcx,%r12,1),%rcx
 	add	%rcx,%rax
-	lea	dv_quant_shifts(%rip),%r11
+	mov	dv_quant_shifts@GOTPCREL(%rip),%r11
 	lea	(%r11,%rax,4),%r11	/* r11 is pq */
 
 	/* extra = (class == 3); */
diff -aur libdv-0.104/libdv/vlc_x86_64.S libdv-0.104-patched/libdv/vlc_x86_64.S
--- libdv-0.104/libdv/vlc_x86_64.S	2004-10-20 04:49:24.000000000 +0100
+++ libdv-0.104-patched/libdv/vlc_x86_64.S	2004-12-12 05:43:49.000000000 +0000
@@ -16,28 +16,28 @@
 	/* klass = dv_vlc_classes[maxbits][(bits & (dv_vlc_class_index_mask[maxbits])) >> */
 	/*         (dv_vlc_class_index_rshift[maxbits])];  */
 /*	xor  %rbp,%rbp */
-	lea  dv_vlc_class_index_mask(%rip),%r11            /* use %rip for PIC code */
+	mov  dv_vlc_class_index_mask@GOTPCREL(%rip),%r11    /* use %rip for PIC code */
  	mov  (%r11,%rbx,4),%ebp           /* int32 */      /* dv_vlc_class_index_mask[maxbits] */
 	and  %eax,%ebp                                     /* bits & */
-	lea  dv_vlc_class_index_rshift(%rip),%rcx
+	mov  dv_vlc_class_index_rshift@GOTPCREL(%rip),%rcx
 	mov  (%rcx,%rbx,4),%ecx           /* int32 */      /* dv_vlc_class_index_rshift[maxbits] */
 	sar  %cl,%ebp                                      /* >> */
-	lea  dv_vlc_classes(%rip),%rcx
+	mov  dv_vlc_classes@GOTPCREL(%rip),%rcx
 	mov  (%rcx,%rbx,8),%rcx           /* ptr */        /* dv_vlc_classes[maxbits], a pointer */
 	movsbq  (%rcx,%rbp,1),%rbp        /* int8 */       /* klass = */
 
 	/* *result = dv_vlc_lookups[klass][(bits & (dv_vlc_index_mask[klass])) >> */
 	/*           (dv_vlc_index_rshift[klass])];   */
 /*	xor  %rbx,%rbx */
-	lea  dv_vlc_index_mask(%rip),%r11
+	mov  dv_vlc_index_mask@GOTPCREL(%rip),%r11
 	mov  (%r11,%rbp,4),%ebx          /* int32 */       /* (dv_vlc_index_mask[klass]) */
 /*	xor  %rcx,%rcx */
-	lea  dv_vlc_index_rshift(%rip),%r11
+	mov  dv_vlc_index_rshift@GOTPCREL(%rip),%r11
 	mov  (%r11,%rbp,4),%ecx          /* int32 */       /* dv_vlc_index_rshift[klass] */
 	and  %eax,%ebx                                     /* bits &  */
 	sar  %cl,%ebx                                      /* >> */
 
-	lea  dv_vlc_lookups(%rip),%r11
+	mov  dv_vlc_lookups@GOTPCREL(%rip),%r11
 	mov  (%r11,%rbp,8),%rbp          /* ptr */         /* dv_vlc_lookups[klass] */
 	mov  (%rbp,%rbx,4),%ebp          /* int32 */       /* *result = */
 
@@ -57,7 +57,7 @@
 	mov  %ebp,%ecx
 	sar  $8,%ecx
 	and  $0xff,%ecx                /* result->len */
-	lea  sign_mask(%rip),%rbx
+	mov  sign_mask@GOTPCREL(%rip),%rbx
 	mov  (%rbx,%rcx,4),%ebx        /* int32 */
 	and  %ebx,%eax
 	neg  %eax
@@ -109,17 +109,17 @@
 	mov  %rax,%rbp
 	and  $0xfe00,%ebp
 	sar  $9,%ebp
-	lea  dv_vlc_class_lookup5(%rip),%r11
+	mov  dv_vlc_class_lookup5@GOTPCREL(%rip),%r11
 	movsbq  (%r11,%rbp),%rbp        /* int8 klass */
 
-	lea  dv_vlc_index_mask(%rip),%rbx
+	mov  dv_vlc_index_mask@GOTPCREL(%rip),%rbx
 	mov  (%rbx,%rbp,4),%ebx         /* int32 */
-	lea  dv_vlc_index_rshift(%rip),%rcx
+	mov  dv_vlc_index_rshift@GOTPCREL(%rip),%rcx
 	mov  (%rcx,%rbp,4),%ecx         /* int32 */
 	and  %eax,%ebx
 	sar  %cl,%ebx			/* %rbx is klass */
 
-	lea  dv_vlc_lookups(%rip),%r11
+	mov  dv_vlc_lookups@GOTPCREL(%rip),%r11
 	mov  (%r11,%rbp,8),%rbp         /* ptr */
 	mov  (%rbp,%rbx,4),%ebp         /* int32 */
 
@@ -138,7 +138,7 @@
 	mov  %ebp,%ecx
 	sar  $8,%ecx
 	and  $0xff,%ecx
-	lea  sign_mask(%rip),%r11
+	mov  sign_mask@GOTPCREL(%rip),%r11
 	mov  (%r11,%rcx,4),%ecx        /* int32 */
 	and  %ecx,%eax
 	neg  %eax
@@ -253,7 +253,7 @@
 
 	/* Attempt to use the shortcut first.  If it hits, then
 	   this vlc term has been decoded. */
-	lea	dv_vlc_class1_shortcut(%rip),%r10
+	mov	dv_vlc_class1_shortcut@GOTPCREL(%rip),%r10
 	mov	(%r10,%rcx,4),%r11d    /* record32 dv_vlc_tab_t */
 	test	$0x80,%r11d
 	
@@ -267,17 +267,17 @@
 
 	/* %rax is bits */
 	
-	lea  dv_vlc_class_lookup5(%rip),%r10
+	mov  dv_vlc_class_lookup5@GOTPCREL(%rip),%r10
 	movsbq  (%r10,%rcx,1),%rcx     /* int8 */
 
 /*	xor  %r12,%r12 */
-	lea  dv_vlc_index_mask(%rip),%r10
+	mov  dv_vlc_index_mask@GOTPCREL(%rip),%r10
 	mov  (%r10,%rcx,4),%r12d       /* int32 */
 	
-	lea  dv_vlc_lookups(%rip),%r10
+	mov  dv_vlc_lookups@GOTPCREL(%rip),%r10
 	mov  (%r10,%rcx,8),%r11       /* ptr->record32 */
 	
-	lea  dv_vlc_index_rshift(%rip),%r10
+	mov  dv_vlc_index_rshift@GOTPCREL(%rip),%r10
 	mov  (%r10,%rcx,4),%ecx        /* int32 */
 	
 	and  %eax,%r12d
@@ -303,7 +303,7 @@
 	mov  %r11d,%ecx
 	sar  $8,%ecx
 	and  $0xff,%ecx
-	lea  sign_mask(%rip),%r10
+	mov  sign_mask@GOTPCREL(%rip),%r10
 	mov  (%r10,%rcx,4),%ecx      /* int32 */
 	and  %ecx,%eax
 	neg  %eax
@@ -388,7 +388,8 @@
 	mov	%r11,%rsi        /* bits */
 	mov	%rax,%rdi        /* bits_left */
 	lea	vlc(%rip),%rdx   /* *vlc */
-	call	dv_decode_vlc
+	mov	dv_decode_vlc@GOTPCREL(%rip),%r11
+	call	*%r11
 	pop	%rdx
 	pop	%rsi
 	pop	%rdi
@@ -473,7 +474,7 @@
 	movl	%r11d,dv_macroblock_t_eob_count(%r13) /* int32 */
 
 	/* mb->i = (seg->i + dv_super_map_vertical[m]) % (seg->isPAL?12:10); */
-	lea	dv_super_map_vertical(%rip),%r11
+	mov	dv_super_map_vertical@GOTPCREL(%rip),%r11
 	movl	(%r11,%rax,4),%r11d                     /* int32 */
 /*	xor	%rcx,%rcx */
 	movl	dv_videosegment_t_i(%r12),%ecx          /* int32 */
@@ -493,7 +494,7 @@
 	movl	%r11d,dv_macroblock_t_i(%r13)         /* int32 */
 
 	/*  mb->j = dv_super_map_horizontal[m]; */		
-	lea	dv_super_map_horizontal(%rip),%r11
+	mov	dv_super_map_horizontal@GOTPCREL(%rip),%r11
 	movl	(%r11,%rax,4),%r11d                   /* int32 */
 	movl	%r11d,dv_macroblock_t_j(%r13)         /* int32 */
 
@@ -546,7 +547,8 @@
 
 	/* bl->reorder = &dv_reorder[bl->dct_mode][1]; */
 	shl	$6,%rax                          /* *64 */
-	lea	(dv_reorder+1)(%rip),%rcx
+	mov	dv_reorder@GOTPCREL(%rip),%rcx
+	add	$1,%rcx
 	add	%rcx,%rax
 	mov	%rax,dv_block_t_reorder(%r15)    /* ptr */
 
@@ -557,13 +559,13 @@
 	/* bl->offset= mb_start + dv_parse_bit_start[b]; */
 /*	xor	%rcx,%rcx */
 	movl	mb_start(%rip),%ecx             /* int32 */
-	lea	dv_parse_bit_start(%rip),%rax
+	mov	dv_parse_bit_start@GOTPCREL(%rip),%rax
 	mov	(%rax,%r12,4),%eax              /* int32 */
 	add	%rcx,%rax
 	movl	%eax,dv_block_t_offset(%r15)    /* int32 */
 
 	/* bl->end= mb_start + dv_parse_bit_end[b]; */
-	lea	dv_parse_bit_end(%rip),%rax
+	mov	dv_parse_bit_end@GOTPCREL(%rip),%rax
 	mov	(%rax,%r12,4),%eax            /* int32 */
 	add	%ecx,%eax
 	mov	%eax,dv_block_t_end(%r15)     /* int32 */
@@ -603,7 +605,8 @@
 	mov	dv_videosegment_t_bs(%rdi),%rdi   /* passed in rdi was seg, now passing seg->bs */
 	mov	%r13,%rsi                         /* mb */
 	mov	%r15,%rdx                         /* bl */
-	call	dv_parse_ac_coeffs_pass0
+	mov     dv_parse_ac_coeffs_pass0@GOTPCREL(%rip),%r11
+	call	*%r11
 	pop	%rdi
 	pop	%rsi
 	pop	%rdx
@@ -635,10 +638,12 @@
 	mov	%rsi,%rax	            /* quality */
 	and	$DV_QUALITY_AC_MASK,%rax
 	cmp	$DV_QUALITY_AC_2,%rax
+
+	jne	done
+	mov	dv_parse_ac_coeffs@GOTPCREL(%rip),%r11
+	jmp	*%r11
 	
-	jz	dv_parse_ac_coeffs
-	
-	mov	$0,%rax
+done:	mov	$0,%rax
 	
 	ret