Linux에서 동일한 이름을 가진 기호 간의 충돌에 대한 솔루션
이 글은 리눅스에서 같은 이름을 가진 기호가 충돌하는 문제에 대한 해결 방법에 대한 정보를 주로 소개합니다. 필요한 친구는 참고할 수 있습니다.
리눅스에서 같은 이름을 가진 기호가 충돌하는 문제에 대한 해결 방법
최근 직장에서 다음과 같은 고통스러운 상황에 직면했습니다. 질문:
Linux에는 세 개의 모듈 aa, bb 및 cc가 있습니다. 기본 상황은 다음과 같습니다.
cc는 cc.so 동적 라이브러리를 얻기 위해 컴파일되고 연결됩니다. cc에는 다음과 같은 인터페이스가 있습니다.
cc_fun { …… do();//调用名为do的cc模块内部函数 …… }
bb는 bb.a static 라이브러리를 얻기 위해 컴파일되고 연결되며, bb에는 다음과 같은 인터페이스가 있습니다.
bb_fun { …… handle = dlopen(cc.so, RTLD_LAZY);//加载cc.so pccfun = dlsym(handle, “cc_fun”);//获取cc_fun函数指针 (*pccfun)();//调用cc_fun函数,此时应该会调用cc模块中的do()函数 do();//调用名为do的bb模块内部函数(与cc模块中的do()函数同名,实现却不相同) …… }
aa 컴파일 후 bb.a를 다음과 같이 연결합니다. -lbb 링크 옵션을 사용하여 aa 실행 프로그램을 가져오고 인터페이스 함수 bb_fun(bb.a의)을 호출합니다.
main { …… bb_fun();//调用bb_fun函数 …… }
작업 중에 aa가 런타임 중에 비정상적으로 작동하는 것이 발견되었습니다. 찾아보니 같은 이름의 do() 함수에 문제가 집중되어 있는 것으로 나타났습니다. 출력 인쇄를 통해 프로그램에서 do() 함수에 대한 두 번의 호출이 모두 bb 모듈의 do() 함수를 호출한 반면 cc 모듈의 do() 함수는 호출되지 않아 비정상적인 프로그램이 발생하는 것으로 나타났습니다. 행동과 메모리 누수. 많은 검증 끝에 Linux 프로그램의 각 라이브러리에 있는 기호 테이블은 결국 프로그램이 있는 전역 기호 테이블에 로드되기 때문에 이때 동일한 이름의 기호가 있으면 첫 번째로 로드된 기호를 호출할 수 있습니다. 즉, 나중에 로드된 동일한 이름의 기호는 이전 기호로 덮어쓰여집니다. cc 모듈의 do() 함수는 bb 모듈의 do() 함수로 덮어쓰기되므로 호출할 수 없습니다.
더 이상 말도 안되는 소리는 하지 마세요. . .
여러 가지 만족스럽지 못한 방법을 시도한 후 최종 해결 방법은 다음과 같습니다.1. cc makefile에 -Wl,-Bsymbolic -Wl,--version-script,version 연결 옵션을 추가합니다. 즉, 버전에 있는 스크립트를 의미합니다. 파일은 내보내는 기능을 지정하는 데 사용됩니다.
2.version 파일의 구현은 다음과 같습니다.
VERS{ global: cc_fun; local: *; };
는 cc 모듈이 인터페이스 함수 cc_fun만 내보내도록 지정되고 다른 함수는 로컬로 설정되어 내보내지지 않음을 의미합니다.
makefile이 있는 디렉토리에 파일을 저장하세요.
3. 세 개의 모듈을 다시 컴파일하고 연결하면 문제가 해결됩니다.
위 내용은 Linux에서 동일한 이름을 가진 기호 간의 충돌에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 시스템의 5 가지 기본 구성 요소는 다음과 같습니다. 1. Kernel, 2. System Library, 3. System Utilities, 4. 그래픽 사용자 인터페이스, 5. 응용 프로그램. 커널은 하드웨어 리소스를 관리하고 시스템 라이브러리는 사전 컴파일 된 기능을 제공하며 시스템 유틸리티는 시스템 관리에 사용되며 GUI는 시각적 상호 작용을 제공하며 응용 프로그램은 이러한 구성 요소를 사용하여 기능을 구현합니다.

VSCODE 내장 터미널은 편집기 내에서 명령 및 스크립트를 실행하여 개발 프로세스를 단순화 할 수있는 개발 도구입니다. VSCODE 터미널 사용 방법 : 바로 가기 키 (CTRL/CMD)로 터미널을 엽니 다. 명령을 입력하거나 스크립트를 실행하십시오. 핫키 (예 : ctrl l)를 사용하여 터미널을 지우십시오). 작업 디렉토리 (예 : CD 명령)를 변경하십시오. 고급 기능에는 디버그 모드, 자동 코드 스 니펫 완료 및 대화식 명령 기록이 포함됩니다.

git 저장소 주소를 보려면 다음 단계를 수행하십시오. 1. 명령 줄을 열고 리포지토리 디렉토리로 이동하십시오. 2. "git remote -v"명령을 실행하십시오. 3. 출력 및 해당 주소에서 저장소 이름을 봅니다.

Visual Studio Code (VSCODE)에서 코드를 작성하는 것은 간단하고 사용하기 쉽습니다. vscode를 설치하고, 프로젝트를 만들고, 언어를 선택하고, 파일을 만들고, 코드를 작성하고, 저장하고 실행합니다. VSCODE의 장점에는 크로스 플랫폼, 무료 및 오픈 소스, 강력한 기능, 풍부한 확장 및 경량 및 빠른가 포함됩니다.

VS 코드 터미널 명령에 대한 원인 및 솔루션을 사용할 수 없습니다 : 필요한 도구가 설치되지 않았습니다 (Wind (다시 설치 또는 업데이트) 터미널 구성이 호환되지 않습니다 (다른 터미널 유형 또는 명령 시도) 특정 환경 변수가 누락되었습니다 (필요한 환경 변수 설정)

vs 코드 1 단계/다음 단계 바로 가기 키 사용 : 1 단계 (뒤로) : Windows/Linux : Ctrl ←; MACOS : CMD ← 다음 단계 (앞으로) : Windows/Linux : Ctrl →; MACOS : CMD →

Sublime에서 코드를 실행하는 6 가지 방법이 있습니다. 핫키, 메뉴, 빌드 시스템, 명령 줄, 기본 빌드 시스템 설정 및 사용자 정의 빌드 명령, 프로젝트/파일을 마우스 오른쪽 단추로 클릭하여 개별 파일/프로젝트를 실행합니다. 빌드 시스템 가용성은 숭고한 텍스트 설치에 따라 다릅니다.
