1
kgdb00 OP ld 能静态链接一个普通的用户库,比如 foo.o 或 libfoo.a ,我想知道的是如何静态链接 gnu c 库。
|
3
secondwtq 2022-01-17 19:23:09 +08:00
GCC 和 Clang 都可以通过使用 -### 参数显示编译过程中运行的命令
|
4
kgdb00 OP @ysc3839 可以静态链接的,fedora 上有一个 glibc-static 包,这个包有一个 /usr/lib64/libc.a 文件,就是 glibc 的静态库
|
5
kgdb00 OP @secondwtq
对,以下是精简过的 gcc 传给 ld 的参数,这条命令可以链接成功,不过我不想依赖 libgcc.a 和 libgcc_eh.a 这两个库,但去掉就链接不通过,难道 gnu c 库静态链接非得和编译器的库绑定在一起? 动态链接的时候是不需要 gcc 的库的。 /bin/ld -m elf_x86_64 -static /usr/lib64/crt1.o /usr/lib64/crti.o main.o \ --start-group \ /lib64/libc.a \ /usr/lib/gcc/x86_64-redhat-linux/11/libgcc.a \ /usr/lib/gcc/x86_64-redhat-linux/11/libgcc_eh.a \ --end-group \ /usr/lib64/crtn.o |
6
kgdb00 OP @kgdb00 #5 "-m elf_x86_64 -static"这两个参数也不是必要的,以下命令就能完全静态链接一个 hello world 的 c 程序。
ld /usr/lib64/crt1.o /usr/lib64/crti.o main.o \ --start-group \ /lib64/libc.a \ /usr/lib/gcc/x86_64-redhat-linux/11/libgcc.a \ /usr/lib/gcc/x86_64-redhat-linux/11/libgcc_eh.a \ --end-group \ /usr/lib64/crtn.o |
9
kgdb00 OP @lcdtyph 试了,不行,和没加这两个参数效果一样,去掉 /usr/lib/gcc/x86_64-redhat-linux/11/libgcc.a 和 /usr/lib/gcc/x86_64-redhat-linux/11/libgcc_eh.a 后报的错一样。
|
10
kgdb00 OP @kgdb00 报的错如下:
ld: /lib64/libc.a(iofclose.o): in function `_IO_new_fclose.cold': (.text.unlikely[.text.unlikely.group]+0x33): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(iofclose.o):(.data.rel.local.DW.ref.__gcc_personality_v0[DW.ref.__gcc_personality_v0]+0x0): undefined reference to `__gcc_personality_v0' ld: /lib64/libc.a(iofflush.o): in function `_IO_fflush.cold': (.text.unlikely[.text.unlikely.group]+0x32): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(wfileops.o): in function `_IO_wfile_underflow.cold': (.text.unlikely[.text.unlikely.group]+0x3d): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(fileops.o): in function `_IO_new_file_underflow.cold': (.text.unlikely[.text.unlikely.group]+0x33): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(printf_fp.o): in function `__printf_fp_l': (.text+0x53f): undefined reference to `__unordtf2' ld: (.text+0x585): undefined reference to `__unordtf2' ld: (.text+0x5ab): undefined reference to `__letf2' ld: /lib64/libc.a(printf_fphex.o): in function `__printf_fphex': (.text+0xa6): undefined reference to `__unordtf2' ld: (.text+0xd9): undefined reference to `__unordtf2' ld: (.text+0xf6): undefined reference to `__letf2' ld: /lib64/libc.a(iofputs.o): in function `_IO_fputs.cold': (.text.unlikely[.text.unlikely.group]+0x32): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(iofwrite.o): in function `_IO_fwrite.cold': (.text.unlikely[.text.unlikely.group]+0x32): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(iogetdelim.o): in function `__getdelim.cold': (.text.unlikely[.text.unlikely.group]+0x32): undefined reference to `_Unwind_Resume' ld: /lib64/libc.a(pthread_once.o): in function `__pthread_once_slow.cold': (.text.unlikely[.text.unlikely.group]+0x25): undefined reference to `_Unwind_Resume' |