[FFmpeg-trac] #272(avcodec:open): altivec specific code segfaults on ppc when compiled with --enable-pic

FFmpeg trac at avcodec.org
Mon Jun 13 18:55:53 CEST 2011

#272: altivec specific code segfaults on ppc when compiled with --enable-pic
Reporter:  kim         |       Owner:
    Type:  defect      |      Status:  open
Priority:  normal      |   Component:  avcodec
 Version:  git-master  |  Resolution:
Keywords:  ppc, PIC    |  Blocked By:
Blocking:              |  Reproduced:  1
Analyzed:  0           |

Comment (by kim):

 Replying to [comment:7 reimar]:
 > Are you sure this isn't specific to your compiler version?
 > LLVM and possible also gcc made an ABI change that optimized the TOC
 register r2 away.
 > The current code thus can't work anymore.

 I think that's what is happening. However I'm using a fairly standard
 compiler (which I think is the default in any recent distro: gcc 4.5.x)
 Also tested with gcc 4.4.5 with the same results so I guess this change in
 gcc is quite old. However I came up with a proof of concept patch to load
 the address of local symbols in a pic friendly way. (I use the standard
 trick of computing the space between a fixed label and the symbol to be
 loaded and then add this to the adresss of the fixed label which is
 determined at runtime using a phony branch instruction). I've tested it on
 linux ppc 32bit and I'm now able to play the above sample without


 diff --git a/libavcodec/ppc/asm.S b/libavcodec/ppc/asm.S
 index e372d53..30e0953 100644
 --- a/libavcodec/ppc/asm.S
 +++ b/libavcodec/ppc/asm.S
 @@ -67,7 +67,11 @@ X(\name):

  .macro movrel rd, sym
 -    lwz     \rd, \sym at got(r2)
 +    bcl             20, 31, lab_pic_\@
 +    mflr    \rd
 +    addis   \rd, \rd, (\sym - lab_pic_\@)@ha
 +    addi    \rd, \rd, (\sym - lab_pic_\@)@l
      lis     \rd, \sym at ha
      la      \rd, \sym at l(\rd)

Ticket URL: <https://avcodec.org/trac/ffmpeg/ticket/272#comment:8>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list