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
.libpthread
libc
libieee
매크로사양 문자열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.o
crtend.o
문서에서 알 수 있듯이 -nostdlib
은 및 의 상위 집합입니다. 또한 가상 테이블 유효성 검사도 비활성화됩니다.-nodefaultlibs
-nostartfiles
따라서 모든 관련 기능을 비활성화 하고 아무것도 추가하지 않는 것으로 -nostdlib
충분합니다 . (그러나 언급하는 것은 나쁘지 않습니다.)-nodefaultlibs
-nostartfiles