dharanad opened a new issue, #12316:
URL: https://github.com/apache/gluten/issues/12316

   ## Environment
   
   - **OS**: Ubuntu 22.04 (also affects Ubuntu 20.04)
   - **Backend**: Velox
   - **Build type**: Dynamic (non-vcpkg)
   
   ## Problem
   
   Building Gluten with the Velox backend on Ubuntu fails at the `libvelox.so` 
link step with:
   
   ```
   /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libgflags.a(gflags.cc.o): relocation 
R_X86_64_PC32 against symbol 'stderr@@GLIBC_2.2.5' can not be used when making 
a shared object; recompile with -fPIC
   /usr/bin/ld: final link failed: bad value
   collect2: error: ld returned 1 exit status
   ```
   
   ## Root Cause
   
   `scripts/setup-ubuntu.sh` installs gflags via `apt-get install 
libgflags-dev`. The apt-packaged `libgflags.a` on Ubuntu is **not compiled with 
`-fPIC`**, so the linker rejects it when it is pulled into `libvelox.so` (a 
shared library).
   
   The issue is in `setup-ubuntu.sh:113`:
   ```bash
   libgflags-dev \   # <-- apt version is not PIC-compiled
   ```
   
   Folly's installed cmake config 
(`/usr/local/lib/cmake/folly/folly-targets.cmake`) hardcodes `gflags_static` as 
a link dependency, which resolves to the non-PIC 
`/usr/lib/x86_64-linux-gnu/libgflags.a`.
   
   ## Why Only Ubuntu
   
   `setup-centos8.sh` and `setup-openeuler24.sh` both have a dedicated 
`install_gflags` function that:
   1. Removes the system package (`dnf remove -y gflags`)
   2. Builds gflags from source with `cmake_install_dir gflags 
-DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON`
   
   `setup-ubuntu.sh` is missing this function entirely.
   
   ## Fix
   
   Add an `install_gflags` function to `setup-ubuntu.sh`, mirroring what 
`setup-centos8.sh` does:
   
   ```bash
   function install_gflags {
     # Remove apt version (not PIC-compiled, cannot be linked into shared libs)
     sudo apt-get remove -y libgflags-dev
     wget_and_untar https://github.com/gflags/gflags/archive/v2.2.2.tar.gz 
gflags
     cmake_install_dir gflags \
       -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
       -DBUILD_SHARED_LIBS=ON \
       -DBUILD_STATIC_LIBS=ON \
       -DBUILD_gflags_LIB=ON
   }
   ```
   
   And call it from `install_dependencies` before building Folly (since Folly's 
cmake export will then reference the PIC-compiled version).
   
   ## Workaround
   
   Until fixed, users on Ubuntu can manually build gflags with PIC before 
running the Gluten build:
   
   ```bash
   sudo apt-get remove -y libgflags-dev
   cd /tmp
   wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz -O gflags.tar.gz
   tar -xzf gflags.tar.gz && cd gflags-2.2.2
   cmake -B build \
     -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
     -DBUILD_SHARED_LIBS=ON \
     -DBUILD_STATIC_LIBS=ON \
     -DBUILD_gflags_LIB=ON \
     -DCMAKE_INSTALL_PREFIX=/usr/local \
     -DCMAKE_BUILD_TYPE=Release
   sudo cmake --build build -j4 --target install
   # Reinstall glog-dev (removed as a side effect)
   sudo apt-get install -y libgoogle-glog-dev
   ```
   
   ## Note
   
   Removing `libgflags-dev` also removes `libgoogle-glog-dev` as a side effect 
(apt dependency), causing a secondary `glog/logging.h: No such file or 
directory` error. The workaround above includes reinstalling 
`libgoogle-glog-dev`.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to