Unexpected PLT reloc type 0x00

I’m attempting to package Vivado 2022.2. I believe I’ve gotten pretty far in the process, but I’m running an issue. When I run the vivado binary (./result/opt/vivado/Vivado/2022.2/bin/vivado), I see the error unexpected PLT reloc type 0x00. From a quick search, this appears to be an issue with the linker tables.

The current build expression for this is:

{ stdenv
, pkgs
, lib
, requireFile
, bash
, zlib
, glibc
# TODO do I need this?
, xorg
}:

stdenv.mkDerivation rec {
  pname = "vivado";
  version = "2022.2";
  subversion = "1014_8888";

  src = requireFile {
    name = "Xilinx_Unified_${version}_${subversion}.tar.gz";
    url = "https://www.xilinx.com/member/forms/download/xef.html?filename=Xilinx_Unified_${version}_${subversion}.tar.gz";
    sha256 = "1s28fwhnjqkng9imqbd89cm8xaf33lq4f511i3irf127lhnav1v0";
  };

  buildInputs = [
    bash
    zlib
    glibc
  ] ++ (with xorg; [
    libXext
    libX11
    libXrender
    libXtst
    libXi
  ]);

  doConfigure = false;
  doBuild = false;

  patchPhase = ''
    patchShebangs .

    # /bin/rm... seriously...?
    sed -i 's/\/bin\/rm/rm/g' xsetup

    # change references to $HOME and $USER
    sed -i 's/\$HOME/"_home"/g' xsetup
    sed -i 's/\$USER/"_home"/g' xsetup

    # fix interpreter paths
    for exe in $(find bin tps/lnx64/jre11.0.11_9/bin -executable -type f); do
        isELF "$exe" || continue
        if [[ "$(basename $exe)" == "rlwrap" ]]; then continue; fi
        echo "patching $exe..."
        patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$exe"
    done

    # add missing libraries to java RPATH directory
    ln -s ${zlib}/lib/libz.so.1 lib/lnx64.o/

    # add missing libraries to tps/lnx64/jre11.0.11_9/lib/libawt_xawt.so
    basePath="tps/lnx64/jre11.0.11_9/lib"
    ln -s $basePath/server/libjvm.so $basePath/
  '';

  installPhase = ''
    mkdir -p $out/opt/vivado

    ./xsetup --agree 3rdPartyEULA,XilinxEULA \
      --batch Install \
      --product "Vitis" \
      --edition "Vitis Unified Software Platform" \
      --location $out/opt/vivado
  '';

  preFixup = ''
    # For all tool main binaries, set interpreter and add requisite runpaths.
    dynamicLinker="$(cat $NIX_CC/nix-support/dynamic-linker)"
    tools=("Model_Composer" "Vitis" "Vitis_HLS" "Vivado")
    for tool in ''${tools[*]}; do
      for exe in $(find $out/opt/vivado/$tool/${version}/bin/unwrapped/lnx64.o -maxdepth 1 -type f); do
        isELF $exe || continue
        if [[ "$(basename $exe)" == "rlwrap" ]]; then continue; fi
        # Apparently, patchelf cannot accept multiple options at once.
        patchelf --set-interpreter $dynamicLinker $exe
        patchelf --add-rpath $out/opt/vivado/$tool/${version}/lib/lnx64.o $exe
        patchelf \
          --add-rpath $out/opt/vivado/$tool/${version}/lib/lnx64.o/Default $exe
      done
    done

    # Add runpaths to libraries.
    for tool in ''${tools[*]}; do
      for lib in $(find $out/opt/vivado/$tool/${version}/lib/lnx64.o -maxdepth 1 -type f); do
        isELF $lib || continue
        if [[ "$(basename $lib)" == "rlwrap" ]]; then continue; fi
        patchelf --add-rpath $out/opt/vivado/$tool/${version}/lib/lnx64.o $lib
        patchelf \
          --add-rpath $out/opt/vivado/$tool/${version}/lib/lnx64.o/Default $lib
      done
    done
  '';
}

Any ideas about what might be going wrong here? Or, at least, any hints about the right direction to proceed?

No idea, about what is going on, but usually read ldd output for that binary helps debug linker tables

ldd ./result/opt/vivado/Vivado/2022.2/bin/vivado

Check if pointed libraries exists

Thanks for the note. Yeah, I tried this - they’re all there. FYI bin/vivado is a shell script that invokes bin/unwrapped/lnx64.o/vivado, hence why I’ve used ldd on the latter.

$ ldd result/opt/vivado/Vivado/2022.2/bin/unwrapped/lnx64.o/vivado 
        linux-vdso.so.1 (0x00007ffd533ce000)
        libtcmalloc.so.4 => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vivado/2022.2/lib/lnx64.o/libtcmalloc.so.4 (0x00007f5c42c00000)
        librdi_common.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vivado/2022.2/lib/lnx64.o/librdi_common.so (0x00007f5c40f14000)
        librdi_commonmain.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vivado/2022.2/lib/lnx64.o/librdi_commonmain.so (0x00007f5c43007000)
        libstdc++.so.6 => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vivado/2022.2/lib/lnx64.o/Default/libstdc++.so.6 (0x00007f5c40a00000)
        libgcc_s.so.1 => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vivado/2022.2/lib/lnx64.o/Default/libgcc_s.so.1 (0x00007f5c40600000)
        libc.so.6 => /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib/libc.so.6 (0x00007f5c403f7000)
        libpthread.so.0 => /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib/libpthread.so.0 (0x00007f5c43000000)
        libm.so.6 => /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib/libm.so.6 (0x00007f5c42f20000)
        libCOIN-all.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libCOIN-all.so (0x00007f5c3fa00000)
        libboost_date_time.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_date_time.so (0x00007f5c3f600000)
        libboost_filesystem.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_filesystem.so (0x00007f5c3f200000)
        libboost_program_options.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_program_options.so (0x00007f5c3ee00000)
        libboost_regex.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_regex.so (0x00007f5c3ea00000)
        libboost_thread.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_thread.so (0x00007f5c3e600000)
        libboost_xilinx.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_xilinx.so (0x00007f5c42f04000)
        libhdlpsolve.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libhdlpsolve.so (0x00007f5c3e200000)
        libhdxml.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libhdxml.so (0x00007f5c3de00000)
        libisl_iostreams.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libisl_iostreams.so (0x00007f5c3c5a7000)
        libisl_sysinfo.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libisl_sysinfo.so (0x00007f5c40ea3000)
        liblmx6.0.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/liblmx6.0.so (0x00007f5c40df4000)
        libprotobuf.so.18 => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libprotobuf.so.18 (0x00007f5c3bc00000)
        librdi_commonxillic.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/librdi_commonxillic.so (0x00007f5c3b88b000)
        librdiconfig.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/librdiconfig.so (0x00007f5c3b600000)
        librdizlib.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/librdizlib.so (0x00007f5c3b200000)
        libtcl8.5.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libtcl8.5.so (0x00007f5c3ae00000)
        libxerces-c-3.2.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libxerces-c-3.2.so (0x00007f5c3a400000)
        libdl.so.2 => /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib/libdl.so.2 (0x00007f5c42efb000)
        libgurobi90.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libgurobi90.so (0x00007f5c37a00000)
        libgomp.so.1 => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/Default/libgomp.so.1 (0x00007f5c37600000)
        /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib/ld-linux-x86-64.so.2 => /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib64/ld-linux-x86-64.so.2 (0x00007f5c43030000)
        librdi_commonversion.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/librdi_commonversion.so (0x00007f5c42eef000)
        libboost_iostreams.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libboost_iostreams.so (0x00007f5c37200000)
        libisl_iosutils.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libisl_iosutils.so (0x00007f5c42eb2000)
        libXil_lmgr11.so => /nix/store/5k0v1sqcd50rjqyk2dmg3ab70br997f6-vivado-2022.2/opt/vivado/Vitis/2022.2/lib/lnx64.o/libXil_lmgr11.so (0x00007f5c36c00000)
        librt.so.1 => /nix/store/76l4v99sk83ylfwkz8wmwrm4s8h73rhd-glibc-2.35-224/lib/librt.so.1 (0x00007f5c42eab000)

You could try LD_DEBUG=reloc or LD_DEBUG=all to debug relocation processing & combine with readelf to investigate further.

But Vivado is extremely huge/complicated - this is going to be a long ride. I do hope you’re aware of that and have already seen Fhs env for installing xilinx - #2 by Mic92 for hints on getting it to ‘just work’ in a FHSEnv.

2 Likes

I was not aware of FHSEnv - thanks for pointing that out. I’d eventually like a proper build expression for the Xilinx tools, but that seems like a good intermediate solution.