C++ 라이브러리 호환성 지원

Cute_Security15·3일 전
0

linux dev

목록 보기
13/13

상황

정형체적 알고리즘에선 opencv 라이브러리를 사용하고 있다.

opencv 라이브러리는 ubuntu22 에서, aarch64-linux-gnu-g++ 로 빌드하였는데
라이브러리에는 어떤 심볼이 들어가 있다

  • ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@GLIBCXX_3.4.30
root@user-virtual-machine:/mnt/hgfs/shared/libopencv# strings libopencv_core.so.4.5.5 | grep GLIBCXX_3.4.30
GLIBCXX_3.4.30
_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@GLIBCXX_3.4.30
root@user-virtual-machine:/mnt/hgfs/shared/libopencv#

🔍 Symbol:
_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE
🧩 Demangled:
std::condition_variable::wait(std::unique_lock<std::mutex>&)

이 심볼로 인해, opencv 라이브러리를 보드에서 제공하는 rtsp
어플리케이션과 링크할때
링크에러가 발생하게 된다

코드를 입력하세요

상황에 대한 이해를 위해 2가지 전략을 취하였다

  • 자유도를 높이고, 테스트나 확인을 하기 용이한, 가벼운 구조를 채택 (빌드구조)
  • 심볼이 어떤 경로로 들어가게 되었는지, 들어가게 되는 과정에서 갖는 의미는
    무엇이며, 자연스럽게 이걸 제거할수 있는 과정에는 어떤 것이 있을지,
    열린 마인드로 접근 (의미구조)

chatgpt 와 대화하며 2가지 전략을 사용하였고,
구글링 과정에서 빌드구조와 의미구조가 대략적으로 정립되었다

  • 가벼운 conan opencv consumer project 를 구성 (빌드구조)
  • _ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE 심볼 보다는
    뒤에 있는 _GLIBCXX_3.4.30 가 더 중요하다. 따라서 opencv 의존성 코드보다는,
    apt 로 설치되는 시스템 라이브러리에서 들어갔을 가능성이 높다 (의미구조)

여러번의 테스트를 통해, 3가지 감각을 만들수 있었다.

  • libstdc++.so.6 을 링크하는 바이너리 / 라이브러리에는 GLIBCXX 심볼이 들어간다.
  • libstdc++.so.6 는 심볼릭 링크로, 실제 파일명은 libstdc++.so.6.X.Y.Z 이다.
  • ( 이 당시에는 libstdc++6:arm64 패키지가 이 파일을 만든다는 것까지는
    파악하지 못한 시점 )
  • GLIBCXX 심볼은 바이너리 / 라이브러리 빌드당시 사용한 컴파일러 (g++) 버전
    알려준다.

GLIBCXX_3.4.30 심볼은 GCC 12 에서 만들어진다.
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

GCC 12.1.0: GLIBCXX_3.4.30, CXXABI_1.3.13

ubuntu22 의 libstdc++.6.0.30 은 conan install 중 설치되는 apt 패키지에 의해 생성된 파일이다.

  • libstdc++6:arm64 (apt 패키지)

이 파일에 GLIBCXX_3.4.30 심볼이 들어있다.

코드를 입력하세요

따라서, 보드 rootfs 에 있는 libstdc++.so.6.0.28 (GCC 9/10) 가 지원하는 범위를 넘어서게 되고
라이브러리 link 시 에러가 발생하게 된다.

root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs# find . -name "libstdc++*"
./usr/lib/libstdc++.so.6.0.28
./usr/lib/libstdc++.so.6
root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs# 

root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs/usr/lib# strings libstdc++.so.6.0.28 | grep ^GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
...
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH
root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs/usr/lib#

목표

보드에서 지원하는 abi standard 에 맞춰서 opencv 라이브러리를 빌드
정형체적 알고리즘을 만들고 rtsp 어플리케이션과 링크한다

  • a.k.a : GLIBCXX_3.4.30 심볼을 제거하는 자연스러운 방법을 찾고, 수행한다.

확인한 내용

확인사항

경험적으로 다음 사항들을 고려하게 된다.

  • 라이브러리 중 하나라도 libstdc++11 을 사용하면 GLIBCXX_3.4.30 심볼이 들어갈수 있다.
  • conan install 시 설치된 apt 패키지들, 빌드된 라이브러리들 중에 들어갈 우려가 있다.

따라서 다음 확인작업을 수행하였다.

conan target profile 수정 (libstdc++11 --> libstdc++)

  • old library 와의 abi compatibility 유지
  • _GLIBCXX_USE_CXX11_ABI=0 를 부여하는 conan 세팅
[settings]
...
compiler.libcxx=libstdc++

conan install 시 libstdc++6:arm64 가 설치된다.
설치된 파일중 libstdc++.so.6 버전을 확인한다.

  • 문제상황에서는 ubuntu22 에서 작업하고 있었는데,
    문득, launchpad 에 올라와있는 'libstdc++6:arm64 버전' 은
    ubuntu 버전을 낮추면 같이 낮아질수 있겠다는 생각이 들었다.
  • ubuntu22 를 ubuntu18 로 변경 후 libstdc++.so.6 버전을 확인하였다.
  • libstdc++.so.6.0.25 를 쓰고 있다.
  • GCC 8.1.0 이고, GLIBCXX_3.4.25 심볼까지 생성이 가능하다.
  • 따라서 GLIBCXX_3.4.30 심볼은 생성이 불가할 것이다.
root@ubuntu:/usr/lib/aarch64-linux-gnu# ls -l libstdc++.so.6
lrwxrwxrwx 1 root root 19 Mar 10  2020 libstdc++.so.6 -> libstdc++.so.6.0.25
root@ubuntu:/usr/lib/aarch64-linux-gnu#

GCC 8.1.0: libstdc++.so.6.0.25

GCC 8.1.0: GLIBCXX_3.4.25, CXXABI_1.3.11

opencv 빌드환경 구성

보드 sdk 가이드에선 ubuntu18 에서 빌드할 것을 권고하고 있다.

ubuntu18 로 이동하여 gcc7 설치

apt-get install gcc-7-aarch64-linux-gnu g++-7-aarch64-linux-gnu

conan opencv consumer project 를 작성

  • 글 후반부에 gcc 8 로 바꾼, '최종버전' 을 업로드 하였음

conanfile.py

from conan import ConanFile
from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout

# consumer project

class opencvTestConan(ConanFile):

    settings = "os", "arch", "compiler", "build_type"

    name = "opencv_test"
    requires = "opencv/4.5.5"

    def layout(self):
        cmake_layout(self)

    def generate(self):
        tc = CMakeToolchain(self)

        tc.generate()

        deps = CMakeDeps(self)
        deps.generate()

    def build(self):
        cmake = CMake(self)

        cmake.configure()
        cmake.build()

target

[settings]
arch=armv8
build_type=Release
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++
compiler.version=8
os=Linux

[buildenv]
CC=aarch64-linux-gnu-gcc-8
CXX=aarch64-linux-gnu-g++-8
STRIP=aarch64-linux-gnu-strip

[options]
opencv/*:shared=True

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(opencv_test)

set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/install")

if (NOT EXISTS ${CMAKE_INSTALL_PREFIX})
    file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
endif()

find_package(OpenCV REQUIRED)

add_executable(main main.cpp)
target_link_libraries(main PRIVATE ${OpenCV_LIBS})

main.cpp

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));

    cv::circle(image, cv::Point(320, 240), 100, cv::Scalar(0, 255, 0), -1);

    return 0;
}

run.sh

#!/bin/bash

# gtk+-2.0.pc
export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
conan install --build missing . -pr:h=./target -c tools.system.package_manager:mode=install
cd build
source Release/generators/conanbuild.sh
cmake .. -DCMAKE_TOOLCHAIN_FILE=Release/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
make

conan install 수행

conan install 수행 중 추가한 사항들

libgtk-2.0-dev:arm64 설치가 필요하나 일부 의존성 resolve 가 실패

aptitude 로 설치

aptitude install libgtk2.0-dev:arm64

libiconf/1.17 에서 바이너리 생성 테스트 실패

  • 컴파일러에서 미지원 옵션이 있어서 실패 (-V, -m64)

gcc-7 --> gcc-8 로 교체

sudo apt-get install gcc-8-aarch64-linux-gnu g++-8-aarch64-linux-gnu

dav1d/1.4.3 meson 에서 python 버전 테스트 실패

dav1d/1.4.3: Calling build()
dav1d/1.4.3: Meson configure cmd: meson setup --cross-file "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release/conan/conan_meson_cross.ini" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/src" --prefix=/
dav1d/1.4.3: RUN: meson setup --cross-file "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release/conan/conan_meson_cross.ini" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/src" --prefix=/
Meson works correctly only with python 3.7+.
You have python 3.6.9 (default, Mar 10 2023, 16:46:00)

python 3.6.9 --> python 3.8 로 교체

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update

apt-get install python3.8 python3.8-venv python3.8-dev -y
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2

sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.8   2         auto mode
  1            /usr/bin/python3.6   1         manual mode
  2            /usr/bin/python3.8   2         manual mode

Press <enter> to keep the current choice[*], or type selection number: 2

python3
Python 3.8.0 (default, Dec  9 2021, 17:53:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

python 관련 패키지들 업그레이드 (pip, setuptools, wheel, PyYAML)

python3 -m pip install --upgrade pip setuptools wheel

sudo apt remove --purge python3-yaml
python3 -m pip install --no-cache-dir PyYAML

conan 재설치

python3 -m pip install --upgrade --no-cache-dir conan

root@ubuntu:~/opencv# conan --version
Migration: Successfully updated settings.yml
Conan version 2.15.0
root@ubuntu:~/opencv# conan --version
Conan version 2.15.0
root@ubuntu:~/opencv#

opencv 설치확인

  • GLIBCXX_3.4.30 심볼이 없는것을 확인
root@ubuntu:~/.conan2/p/b/openceaa445f7da0c4/b/build/Release/lib# strings libopencv_core.so | grep ^GLIBCXX
GLIBCXX_3.4.20
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.11
GLIBCXX_3.4.9
GLIBCXX_3.4.14
GLIBCXX_3.4.19
GLIBCXX_3.4
root@ubuntu:~/.conan2/p/b/openceaa445f7da0c4/b/build/Release/lib# 

테스트

링크 및 정상실행 확인

profile
관심분야 : Filesystem, Data structure, user/kernel IPC

1개의 댓글

comment-user-thumbnail
약 1시간 전

python3-pip

답글 달기

관련 채용 정보