[cfe-dev] Static linking a program
Shoaib Meenai via cfe-dev
cfe-dev at lists.llvm.org
Tue Jun 26 14:36:18 PDT 2018
Is there any reason you're invoking the linker directly? That's usually fraught with peril, and it's best to let the driver take care of that for you … I do see that you're linking all the start files yourself, but the ordering can also make a difference.
What happens if you just run something like `clang++ -static main.cpp`? Does the resulting a.out run successfully? (The `-static` should get passed from the driver to the linker.)
From: cfe-dev <cfe-dev-bounces at lists.llvm.org> on behalf of cfe-dev <cfe-dev at lists.llvm.org>
Reply-To: Wink Saville <wink at saville.com>
Date: Tuesday, June 26, 2018 at 2:13 PM
To: cfe-dev <cfe-dev at lists.llvm.org>
Subject: [cfe-dev] Static linking a program
I've created a simple program [1] which I'm trying to statically link.
I've got it compiling and linking, but it segfaults when I run it. Obvioulsy
I'm linking the wrong libraries, advice appreciated:
$ cat main.cpp
#include <iostream>
int main(int argc, char *argv[]) {
for (int i=0; i < argc; i++) {
std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}
}
$ cat Makefile
CXX:=clang++
CFLAGS:=-std=c++17 -Wall -pedantic -static
LINKER:=ld.lld
LFLAGS:=-Bstatic
LIBS=/usr/lib/libstdc++.a
LIBS+=/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1/libgcc_eh.a
LIBS+=/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1/libgcc.a
LIBS+=/usr/lib/libc.a
LIBS+=/usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
main: main.o Makefile
$(LINKER) $(LFLAGS) -o $@ $< $(LIBS)
main.o: main.cpp Makefile
$(CXX) $(CFLAGS) -c -o $@ $<
.PHONY: clean
clean:
rm -rf main.o main
$ ld.lld --version
LLD 6.0.0 (compatible with GNU linkers)
wink at wink-desktop:~/prgs/explore-cpp/static-linking
$ clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ make clean && make
rm -rf main.o main
clang++ -std=c++17 -Wall -pedantic -static -c -o main.o main.cpp
ld.lld -Bstatic -o main main.o /usr/lib/libstdc++.a
/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1/libgcc_eh.a
/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.1/libgcc.a /usr/lib/libc.a
/usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
wink at wink-desktop:~/prgs/explore-cpp/static-linking (master)
$ ./main
Segmentation fault (core dumped)
wink at wink-desktop:~/prgs/explore-cpp/static-linking (master)
$ coredumpctl gdb
PID: 23339 (main)
UID: 1000 (wink)
GID: 100 (users)
Signal: 11 (SEGV)
Timestamp: Tue 2018-06-26 13:51:43 PDT (7s ago)
Command Line: ./main
Executable: /home/wink/prgs/explore-cpp/static-linking/main
Control Group: /user.slice/user-1000.slice/session-c2.scope
Unit: session-c2.scope
Slice: user-1000.slice
Session: c2
Owner UID: 1000 (wink)
Boot ID: 65910f0244bf4b62905c0198842b62d4
Machine ID: 8f80fd742eae4659baed812cd07a9439
Hostname: wink-desktop
Storage:
/var/lib/systemd/coredump/core.main.1000.65910f0244bf4b62905c0198842b62d4.23339.1530046303000000.lz4
Message: Process 23339 (main) of user 1000 dumped core.
Stack trace of thread 23339:
#0 0x0000000000382ef6 n/a
(/home/wink/prgs/explore-cpp/static-linking/main)
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from
/home/wink/prgs/explore-cpp/static-linking/main...(no debugging
symbols found)...done.
[New LWP 23339]
Core was generated by `./main'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000382ef6 in _dl_get_origin ()
(gdb) bt
#0 0x0000000000382ef6 in _dl_get_origin ()
#1 0x000000000038255f in _dl_non_dynamic_init ()
#2 0x000000000037ef41 in __libc_init_first ()
#3 0x0000000000393d27 in __libc_start_main ()
#4 0x000000000039368a in _start ()
[1]: https://github.com/winksaville/explore-cpp-static-linking
_______________________________________________
cfe-dev mailing list
cfe-dev at lists.llvm.org<mailto:cfe-dev at lists.llvm.org>
https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Ddev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=a-6d12kEoDpvHTe7FgHqZIzVFXeGNDaY1ojO68-yyUY&s=zXH4GyhwrDgHIBQQ88aviDyW6w65CWL5TQpvBEYKUpI&e=
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180626/296baac1/attachment.html>
More information about the cfe-dev
mailing list