[cfe-dev] Static linking a program

Shoaib Meenai via cfe-dev cfe-dev at lists.llvm.org
Tue Jun 26 14:58:20 PDT 2018


You can pass `-v` to clang++ to make it print out its compiler and linker invocations. (You can also use `-###` to just print those invocations out without actually running them.) You can pass `--verbose` to the linker invocation (or run the driver with `-Xlinker --verbose`) to get the linker to output more information about exactly where it found the libraries.

From: Wink Saville <wink at saville.com>
Date: Tuesday, June 26, 2018 at 2:48 PM
To: Shoaib Meenai <smeenai at fb.com>
Cc: cfe-dev <cfe-dev at lists.llvm.org>
Subject: Re: [cfe-dev] Static linking a program

Yes, that worked:

$ clang++ -static main.cpp

wink at wink-desktop:~/prgs/explore-cpp-static-linking (master)
$ ls -al
total 2132
drwxr-xr-x  3 wink users    4096 Jun 26 14:43 .
drwxr-xr-x 64 wink users    4096 Jun 26 13:58 ..
-rwxr-xr-x  1 wink users 2147832 Jun 26 14:43 a.out
drwxr-xr-x  8 wink users    4096 Jun 26 14:09 .git
-rw-r--r--  1 wink users       9 Jun 26 13:58 .gitignore
-rw-r--r--  1 wink users    1210 Jun 26 13:58 LICENSE
-rw-r--r--  1 wink users     159 Jun 26 14:06 main.cpp
-rw-r--r--  1 wink users     462 Jun 26 13:58 Makefile
-rw-r--r--  1 wink users    2926 Jun 26 14:01 README.md

wink at wink-desktop:~/prgs/explore-cpp-static-linking (master)
$ ./a.out
argv[0]: ./a.out

wink at wink-desktop:~/prgs/explore-cpp-static-linking (master)
$ ldd a.out
not a dynamic executable

Is there a way to find out what it linked it with, I like to "be in control"?



On Tue, Jun 26, 2018 at 2:36 PM, Shoaib Meenai <smeenai at fb.com<mailto:smeenai at fb.com>> wrote:
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<mailto:cfe-dev-bounces at lists.llvm.org>> on behalf of cfe-dev
<cfe-dev at lists.llvm.org<mailto:cfe-dev at lists.llvm.org>>
Reply-To: Wink Saville <wink at saville.com<mailto:wink at saville.com>>
Date: Tuesday, June 26, 2018 at 2:13 PM
To: cfe-dev <cfe-dev at lists.llvm.org<mailto: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/42a66b4f/attachment.html>


More information about the cfe-dev mailing list