Hi, I am trying to use an ilp64 build of OpenBlas alongside an ilp32. The ilp64 build is being built with SYMBOLSUFFIX=64_ to keep the names separate.
Turns out not all the names are modified with a suffix which leads to the ilp32 library calling an internal function in the ilp64 library. This can cause wrong memory accesses due to the 32/64 bit difference. Perhaps internal names (e.g., dsdot_k) should not be public in the build .so?
Here is a Dockerfile that shows the crash happening when linking against both ilp32+ilp64-with-suffixes.
FROM debian:bookworm
ARG OPENBLAS_REF=v0.3.33
ARG MAKE_JOBS=4
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates curl file g++ gfortran make binutils perl xz-utils && \
rm -rf /var/lib/apt/lists/*
WORKDIR /src
RUN curl -fsSL "https://github.com/OpenMathLib/OpenBLAS/archive/refs/tags/${OPENBLAS_REF}.tar.gz" \
-o openblas.tar.gz && \
mkdir openblas-ilp32 openblas-ilp64 && \
tar -xzf openblas.tar.gz -C openblas-ilp32 --strip-components=1 && \
tar -xzf openblas.tar.gz -C openblas-ilp64 --strip-components=1 && \
rm openblas.tar.gz
RUN make -C /src/openblas-ilp32 -j"${MAKE_JOBS}" \
USE_THREAD=0 NO_LAPACKE=1 && \
make -C /src/openblas-ilp32 install \
PREFIX=/opt/openblas-ilp32 USE_THREAD=0 NO_LAPACKE=1 && \
make -C /src/openblas-ilp64 -j"${MAKE_JOBS}" \
USE_THREAD=0 NO_LAPACKE=1 INTERFACE64=1 SYMBOLSUFFIX=64_ LIBNAMESUFFIX=cpp && \
make -C /src/openblas-ilp64 install \
PREFIX=/opt/openblas-ilp64 USE_THREAD=0 NO_LAPACKE=1 \
INTERFACE64=1 SYMBOLSUFFIX=64_ LIBNAMESUFFIX=cpp && \
rm -rf /src/openblas-ilp32 /src/openblas-ilp64
COPY link_time_reproducer.cpp /src/link_time_reproducer.cpp
COPY docker_run_reproducer.sh /usr/local/bin/docker_run_reproducer
RUN g++ -O0 -g -Wall -Wextra -std=c++17 \
-o /usr/local/bin/link_time_reproducer /src/link_time_reproducer.cpp \
-Wl,-rpath,/opt/openblas-ilp64/lib \
-Wl,-rpath,/opt/openblas-ilp32/lib \
-Wl,--no-as-needed \
/opt/openblas-ilp64/lib/libopenblas64_cpp.so \
/opt/openblas-ilp32/lib/libopenblas.so \
-ldl && \
chmod +x /usr/local/bin/docker_run_reproducer
CMD ["/usr/local/bin/docker_run_reproducer"]
docker_run_reproducer.sh
link_time_reproducer.cpp
Hi, I am trying to use an ilp64 build of OpenBlas alongside an ilp32. The ilp64 build is being built with SYMBOLSUFFIX=64_ to keep the names separate.
Turns out not all the names are modified with a suffix which leads to the ilp32 library calling an internal function in the ilp64 library. This can cause wrong memory accesses due to the 32/64 bit difference. Perhaps internal names (e.g., dsdot_k) should not be public in the build .so?
Here is a Dockerfile that shows the crash happening when linking against both ilp32+ilp64-with-suffixes.
docker_run_reproducer.sh
link_time_reproducer.cpp