이것을 시도하고 싶다LLDLLVM에서. 문서는 apt에서 찾을 수 있습니다.여기, 그러나 어떤 패키지에 실행 파일이 포함되어 있는지 모르겠습니다 lld
.
lld
목적 은 시스템 종속성을 제거하는 것 같지만 clang에는 lld
내장되어 있지 않습니다. (아직 아님?)
다음 예를 사용하여 lld
사용 여부를 테스트합니다. GNU-ld
아카이브 파일이 나타나는 순서에는 몇 가지 제한이 있지만 lld
(제가 올바르게 이해한 경우) 이에 대해 더 관대해 보이기 때문에 lld
이 예제를 사용하면 성공적으로 빌드될 것입니다. 그러나 내 상자에서는 실패했습니다.
# one.c
extern int two();
int main(int argc, char *argv[])
{
two();
return 0;
}
# two.c
void two(){}
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang two.a one.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
우리가 사용하는 경우 -v
:
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang -v two.a one.o
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
"/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/lib -L/usr/lib two.a one.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
주변 전압
Ubuntu clang 버전 3.4-1ubuntu3(tags/RELEASE_34/final)(LLVM 3.4 기반) 대상: x86_64-pc-linux-gnu 스레딩 모델: posix
답변1
2017년 1월부터,LLVM 적절한 저장소lld도 마찬가지다.스냅샷 패키지Debian에서 사용 가능합니다(불안정한 4.0부터, 5.0부터 실험적). 버전 5부터 lld
패키지는 Debian( lld-5.0
Debian 9 및 10, Debian 9 및 10의 이후 패키지, 현재 준비 중인 릴리스) 에서 사용할 수 있습니다 stretch-backports
.lld-6.0
stretch-backports
lld-7
lld-8
buster-backports
Debian 또는 Ubuntu에 업스트림 패키지를 설치하려면 지침을 따르세요.당신이 배포할 수 있도록.
이 답변이 원래 2015년 2월에 작성되었을 때,LLVM 적절한 저장소LLVM, Clang, 컴파일러-rt, 폴리 및 LLDB가 포함되어 있음을 의미합니다. lld는 포함되어 있지 않습니다. 심지어최신 스냅샷 패키지Debian(LLVM 패키지와 동일한 팀에서 유지 관리)에는 lld가 포함되어 있지 않습니다.
답변2
lld가 아직 Clang/LLVM 성숙도에 도달하지 않은 것 같으므로 기본 패키지에 포함되지 않습니다.
LLVM의 링커에 대해 약간의 혼란이 있습니다(저도 혼란스럽습니다). 이 답변의 나머지 부분은 (원래 질문에 직접적으로 답변하지는 않지만) 우리가 말하는 내용을 정의하는 데 혼란을 없애는 데 도움이 됩니다! 링커에는 세 가지 유형이 있습니다.
- LLVM-LD- LLVM 비트 파일과 실행 가능한 바이너리 객체 파일을 위한 링커처럼 들립니다. 하지만, 그여기에 대답하세요(및 링크 제공)은 LLVM 3.2에서 lld가 제거되었음을 나타냅니다. 이때 대체 링커는 없으며 시스템 ld 링커를 사용해야 합니다.
- llvm-링크- LLVM 비트 파일에 대한 현재 링커입니다.
- LLD- 실행 가능한 바이너리 개체 파일만 연결하는 ld를 대체하기 위해 적극적으로 개발된 것처럼 들립니다.이 답변은 여기에 있습니다2014년 5월 현재 활발히 개발 중이라고 밝혔습니다. 홈 디렉토리에 나열되어 있습니다LLVM 프로젝트 목록#13처럼요. 나는 그것이 GNU ld/gold를 대체하기 위해 메인 LLVM 패키지에 포함될 만큼 시간이 지나면서 더 좋아지고 성숙해질 것이라고 생각합니다.
답변3
사용우분투 패키지 검색 웹사이트"lld-4.0"이라는 패키지를 표시합니다. Ubuntu 개발 브랜치에는 lld, 특히 "lld-5.0"을 포함할 수 있는 다른 패키지가 있습니다(clever.)
'lld-4.0' 패키지는 'lld'라는 이름이 아닌 실행 파일을 설치합니다. 예를 들어 범용 드라이버인 "lld-4.0"을 설치합니다. 이것을 호출하면 Linux에서 "ld.lld-4.0"을 호출하라는 메시지가 표시됩니다.
Ubuntu에서 설치된 패키지를 테스트합니다.
which ld.lld-4.0
ld.lld-4.0 --version