연결에 일부 기호가 필요한 이유를 확인하는 방법은 무엇입니까?

순양함 전쟁

이 질문은 번거 롭습니다. 짧은 버전을 시도해 보겠습니다. 일반적으로 실패 할 때 unresolved symbol reference매우 간단 합니다. 여기서 링커가 찾을 수없는 것을 호출합니다. 링커에 라이브러리를 제공하기 만하면 작동합니다. 때로는 벽에 머리를 두드리는 경우 링커가이 기호를 여기 저기 원하는 이유를 알지 못하는 경우가 있습니다. 적어도 직접적으로는 호출되지 않습니다. 기호가 "여기"에 필요하다고 생각하는 이유를 설명 할 수있는 도구 / 링커 스위치가 있습니까?

원래 질문은 정적 연결에 관한 것입니다. 나는 작은 유틸리티, 몇 줄의 코드, 몇 가지 포함을 가지고 있습니다. 라는 라이브러리와 정적으로 링크 된 유틸리티 lib1입니다. 기호 사용하기 때문에 lib1다른 라이브러리에 대한 종속성이 있다고 가정 보겠습니다 . 그러나 아무것도 사용 에서 에서 유틸리티도 아무것도에서 호출 사용 / 그에 의존하지 않을 수 있습니다 . 그러나 앞서 언급 한 작은 유틸리티는 . 첫 번째 질문은 이유입니다. 유틸리티에서는 어디에서나 필요하지 않으며 심지어 그 사용의 기호도lib2lib1sym1lib2sym1lib2lib1lib2sym1sym1lib1sym1유틸리티에서 사용되는 이유는 링커가 처음에이 기호를 찾는 데 귀찮은 이유는 무엇입니까? 두 번째 질문은 포함 체인 sym1이 내 유틸리티에 기호 도입 할 가능성이 있습니다 . 그러면 "이유"에 대한 답변이 나오지만 도입해서는 안됩니다 (적어도 그 이유는 분명하지 않습니다). 두 번째 질문은 어떻게해야 하는가입니다. 링커가 유틸리티가 필요하다고 생각하는 이유 sym1lib2무엇입니까?

무엇 / 언제 / 이유 : Linux, C / C ++, GCC-9 / Clang-9

Severin Pappadeux

글쎄, 분명히 나는 ​​코드와 오류 메시지를 보지 못하는 질문에 대답했습니다. 내 psi- 컨설턴트를 열 시간입니다.

Linux / ELF 대상에서의 링크와 관련하여 링커는 기호를 충족 / ​​해결하려고 시도하는 동안 섹션 (일명 세그먼트)을 병합 (및 최종 실행 파일로 복사)한다는 사실을 기억하는 것이 중요합니다. 일반적으로 앱에는 .text (코드 세그먼트), .rodata (읽기 전용 데이터) 세그먼트, .data (r / w 초기화 된 데이터) 세그먼트, .bss (초기화되지 않은 데이터) 등이 있습니다. 따라서 필요한 경우 심볼은 세 가지 기능 중 하나입니다. 하나의 컴파일 된 파일에서 파일의 전체 .text 섹션이 선택됩니다. 사용하지 않지만 섹션 함수에있는 경우 다른 것을 호출하면 링커는 응용 프로그램과 관련이 없더라도 만족할 "다른 것"을 검색하기 시작합니다.

또한, C ++에 특정한 것이 있습니다. 가상 함수가있는 클래스의 경우 컴파일러는 각 가상 함수에 대한 포인터를 사용하여 vtable을 생성하고이 테이블을 .rodata 섹션으로 이동합니다. 우리가 코드로 생각하는 것은 실제로 (읽기 전용) DATA 섹션에서 끝납니다.

가상 함수를 하나만 제외하고 모두 정의한 경우 링커는 다음과 같은 오류 메시지를 표시합니다.

/tmp/cc5YTcBb.o:(.rodata._ZTV3CL1[_ZTV3CL1]+0x18): undefined reference to `CL1::fnc2()

문제가 .text가 아닌 .rodata에 있음을 알 수 있습니다.

이야기의 도덕 : 코드와 데이터를 가능한 가장 작은 섹션 / 세그먼트, 연결 원자로 쪼개십시오. 이상적으로, 각 함수는 초기화 된 데이터 또는 R / O 데이터와 함께 자체 섹션으로 이동합니다.

마지막 단계는 -Wl 옵션을 통해 링커에게 사용하지 않는 모든 섹션을 버리도록 (garbage-collect) 지시하는 것입니다.

일반적으로 링커에서 더 많은 RAM을 사용할 것으로 예상해야합니다. 링크 단계는 더 느리지 만 앱은 더 작고 더 빠릅니다.

사용할 명령 줄, GCC 매뉴얼 wrt 옵션 의미를 살펴보십시오.

g++ -fdata-sections -ffunction-sections -fipa-pta main.cpp -Wl,--gc-sections -Wl,-O1 -Wl,--as-needed

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

일부 DLL 파일에 연결을 위해 추가 .lib 파일이 필요한 이유는 무엇입니까?

분류에서Dev

R 또는 Excel에서 특정 열의 행이 동일한 부호를 가지고 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

배열에 동일한 요소가 2 개 이상 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

내 함수에 인수가 필요한 이유와 with + without을 호출하는 방법은 무엇입니까?

분류에서Dev

PenDrive에서 부팅 가능한 것이 MBR인지 GPT인지 확인하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 연결된 일부 구성 요소를 제거하는 방법은 무엇입니까?

분류에서Dev

이메일 ID가 Spring MVC에 있는지 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

Android의 JSONArray에서 두 값이 동일한 지 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

텍스트 상자에 동일한 데이터를 입력했는지 확인하는 방법은 무엇입니까? (데이터베이스 필요 없음)

분류에서Dev

키 저장소에 서버에 연결하는 데 필요한 모든 인증서가 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

Split () 결과가 유효한지 확인하는 방법은 무엇입니까?

분류에서Dev

1 부모의 두 자식 유형이있는 ArrayList에서 변수가 속한 자식 클래스를 확인하는 방법은 무엇입니까?

분류에서Dev

가능한 파일에 대한 UIWebView URL 링크를 확인하는 방법은 무엇입니까?

분류에서Dev

Bottle-WebSocket : HTTP 요청이 ws 연결과 동일한 세션에서 오는지 확인하는 방법은 무엇입니까?

분류에서Dev

각 항공사에 대한 상위 5 가지 이유를 확인하는 방법은 무엇입니까?

분류에서Dev

단일 연결 목록의 시작 부분에 노드를 추가하는 방법은 무엇입니까?

분류에서Dev

글꼴 파일에서 사용 가능한 모든 문자를 확인하는 방법은 무엇입니까?

분류에서Dev

ncurses의 지정된 위치에 동일한 기호를 추가하는 짧은 방법은 무엇입니까?

분류에서Dev

OctoberCMS에서 중계기 내부 필드에 필요한 유효성 검사를 설정하는 방법은 무엇입니까?

분류에서Dev

Firestore에 데이터 쓰기가 성공했는지 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

데이터의 출처가 연결된 테이블에 대한 Microsoft Access 연결 문자열을 확인하는 방법은 무엇입니까?

분류에서Dev

datetime 선택기의 선택한 값이 일부 값 범위에 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

동일한 블록에 요소가 인라인 된 부트 스트랩 그리드보기를 표시하는 방법은 무엇입니까?

분류에서Dev

병합이 필요한 경우 병합하기 전에 Git으로 확인하는 방법은 무엇입니까? ( "이미 최신 상태입니다.")

분류에서Dev

동일한 숫자를 가진 번호를 감지하지 않고 목록에서 번호를 확인하는 방법은 무엇입니까?

분류에서Dev

추가 $ http 요청에 대한 화면 높이를 확인하는 방법은 무엇입니까?

분류에서Dev

MongoDB : 동일한 연결로 다른 데이터베이스에 연결하는 방법은 무엇입니까?

분류에서Dev

필요한 모든 코드가 내부에있는 함수 또는 필요한 코드가있는 내부에 다른 함수가있는 함수를 호출하는 것이 더 좋은 방법은 무엇입니까?

분류에서Dev

입력 첨부 파일에 바인딩 할 설명자 세트가 필요한 이유는 무엇입니까?

Related 관련 기사

  1. 1

    일부 DLL 파일에 연결을 위해 추가 .lib 파일이 필요한 이유는 무엇입니까?

  2. 2

    R 또는 Excel에서 특정 열의 행이 동일한 부호를 가지고 있는지 확인하는 방법은 무엇입니까?

  3. 3

    배열에 동일한 요소가 2 개 이상 있는지 확인하는 방법은 무엇입니까?

  4. 4

    내 함수에 인수가 필요한 이유와 with + without을 호출하는 방법은 무엇입니까?

  5. 5

    PenDrive에서 부팅 가능한 것이 MBR인지 GPT인지 확인하는 방법은 무엇입니까?

  6. 6

    파이썬에서 연결된 일부 구성 요소를 제거하는 방법은 무엇입니까?

  7. 7

    이메일 ID가 Spring MVC에 있는지 여부를 확인하는 방법은 무엇입니까?

  8. 8

    Android의 JSONArray에서 두 값이 동일한 지 여부를 확인하는 방법은 무엇입니까?

  9. 9

    텍스트 상자에 동일한 데이터를 입력했는지 확인하는 방법은 무엇입니까? (데이터베이스 필요 없음)

  10. 10

    키 저장소에 서버에 연결하는 데 필요한 모든 인증서가 있는지 확인하는 방법은 무엇입니까?

  11. 11

    Split () 결과가 유효한지 확인하는 방법은 무엇입니까?

  12. 12

    1 부모의 두 자식 유형이있는 ArrayList에서 변수가 속한 자식 클래스를 확인하는 방법은 무엇입니까?

  13. 13

    가능한 파일에 대한 UIWebView URL 링크를 확인하는 방법은 무엇입니까?

  14. 14

    Bottle-WebSocket : HTTP 요청이 ws 연결과 동일한 세션에서 오는지 확인하는 방법은 무엇입니까?

  15. 15

    각 항공사에 대한 상위 5 가지 이유를 확인하는 방법은 무엇입니까?

  16. 16

    단일 연결 목록의 시작 부분에 노드를 추가하는 방법은 무엇입니까?

  17. 17

    글꼴 파일에서 사용 가능한 모든 문자를 확인하는 방법은 무엇입니까?

  18. 18

    ncurses의 지정된 위치에 동일한 기호를 추가하는 짧은 방법은 무엇입니까?

  19. 19

    OctoberCMS에서 중계기 내부 필드에 필요한 유효성 검사를 설정하는 방법은 무엇입니까?

  20. 20

    Firestore에 데이터 쓰기가 성공했는지 여부를 확인하는 방법은 무엇입니까?

  21. 21

    데이터의 출처가 연결된 테이블에 대한 Microsoft Access 연결 문자열을 확인하는 방법은 무엇입니까?

  22. 22

    datetime 선택기의 선택한 값이 일부 값 범위에 있는지 확인하는 방법은 무엇입니까?

  23. 23

    동일한 블록에 요소가 인라인 된 부트 스트랩 그리드보기를 표시하는 방법은 무엇입니까?

  24. 24

    병합이 필요한 경우 병합하기 전에 Git으로 확인하는 방법은 무엇입니까? ( "이미 최신 상태입니다.")

  25. 25

    동일한 숫자를 가진 번호를 감지하지 않고 목록에서 번호를 확인하는 방법은 무엇입니까?

  26. 26

    추가 $ http 요청에 대한 화면 높이를 확인하는 방법은 무엇입니까?

  27. 27

    MongoDB : 동일한 연결로 다른 데이터베이스에 연결하는 방법은 무엇입니까?

  28. 28

    필요한 모든 코드가 내부에있는 함수 또는 필요한 코드가있는 내부에 다른 함수가있는 함수를 호출하는 것이 더 좋은 방법은 무엇입니까?

  29. 29

    입력 첨부 파일에 바인딩 할 설명자 세트가 필요한 이유는 무엇입니까?

뜨겁다태그

보관