링커 플래그의 차이점

링커 플래그의 차이점

Linux 커널에 C++ 런타임 및 예외 지원을 추가하고 있습니다. 이렇게 하려면 컴파일러에서 제공하는 표준 라이브러리 lib/gcc대신 자체 라이브러리를 제공해야 합니다 .lib/libstdc++

그래서 링커에 전달할 플래그에 대해 혼란스러워합니다. 일반 커널의 최상위 Makefile에서는 LD = $(CROSS_COMPILE)ld커널이 기본 표준 라이브러리와 시작 파일을 사용할 수 있도록 합니다. 내 커널의 경우 LD = $(CROSS_COMPILE)ld -nostdlib -nodefaultlibs -nostartfiles설명서의 지침을 따랐습니다. 내가 무엇을 배웠는지GCC 문서-nostdlib링커에 전달하는 것은 두 가지를 모두 전달하는 것입니다 -nodefaultlibs -nostartfiles. 이 플래그의 실제 차이점은 무엇입니까?

답변1

이러한 플래그는 다음에 정의되어 있습니다.GCC 사양 파일, 따라서 둘 사이의 차이점을 확인하는 가장 좋은 방법은 다음을 살펴보는 것입니다.

gcc -dumpspecs

관련 부분은 link_command정의입니다. 이는 다음과 같은 효과가 있음을 -nostdlib보여 -nodefaultlibs줍니다 -nostartfiles.

  • %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}— 필요 에 따라 추가됩니다 libgcc.libpthreadlibclibieee매크로사양 문자열 lib;libgcc
  • %{!nostdlib:%{!nostartfiles:%S}}startfile시작을 처리하기 위해 추가할 개체 파일( crti.o등) 을 지정하는 사양 문자열을 추가합니다.
  • %{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end} %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}— 가상 테이블 검증을 추가합니다.libvtv
  • %{!nostdlib:%{!nodefaultlibs:%{mmpx:%{fcheck-pointer-bounds: %{static:--whole-archive -lmpx --no-whole-archive %:include(libmpx.spec)%(link_libmpx)} %{!static:%{static-libmpx:-Bstatic --whole-archive} %{!static-libmpx:--push-state --no-as-needed} -lmpx %{!static-libmpx:--pop-state} %{static-libmpx:--no-whole-archive -Bdynamic %:include(libmpx.spec)%(link_libmpx)}}}}%{mmpx:%{fcheck-pointer-bounds:%{!fno-chkp-use-wrappers: %{static:-lmpxwrappers} %{!static:%{static-libmpxwrappers:-Bstatic} -lmpxwrappers %{static-libmpxwrappers: -Bdynamic}}}}}}}——이 처리libmpx
  • %{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address): %{static-libasan:%:include(libsanitizer.spec)%(link_libasan)} %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(thread): %{static-libtsan:%:include(libsanitizer.spec)%(link_libtsan)} %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):%{static-libubsan:-Bstatic} -lubsan %{static-libubsan:-Bdynamic} %{static-libubsan:%:include(libsanitizer.spec)%(link_libubsan)}} %{%:sanitize(leak): %{static-liblsan:%:include(libsanitizer.spec)%(link_liblsan)}}}}— 다양한 소독 옵션을 처리합니다.
  • %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}— 스택 보호 옵션을 추가하고 C 연결 시퀀스를 반복합니다(라이브러리는 처음에 지정됨).
  • %{!nostdlib:%{!nostartfiles:%E}}— 나머지( 등 ) endfile을 처리하기 위해 추가할 개체 파일을 지정하는 사양 문자열을 추가합니다.crtfastmath.ocrtend.o

문서에서 알 수 있듯이 -nostdlib은 및 의 상위 집합입니다. 또한 가상 테이블 유효성 검사도 비활성화됩니다.-nodefaultlibs-nostartfiles

따라서 모든 관련 기능을 비활성화 하고 아무것도 추가하지 않는 것으로 -nostdlib충분합니다 . (그러나 언급하는 것은 나쁘지 않습니다.)-nodefaultlibs-nostartfiles

관련 정보