标签: static-linking

当静态链接到 .a 文件时,C 编译器是否会丢弃未使用的函数?

假设我有一个静态main.c链接到libmine.a. 静态链接到库会导致库函数在编译时嵌入到主可执行文件中。

如果libmine.a要提供 未使用的函数main.c,编译器(例如 GCC)会丢弃这些函数吗?

这个问题的灵感来自于“常见消息传递”,即使用静态库会使可执行文件更大,所以我很好奇编译器是否至少从存档文件中删除未使用的代码。

compiling c compiler libraries static-linking

35
推荐指数
2
解决办法
9482
查看次数

bash-static 有什么用?

与常规 bash 相比,bash-static 的目的是什么?它作为救援壳好还是有什么用?

bash static-linking

17
推荐指数
1
解决办法
2797
查看次数

创建静态二进制文件

我安装了一个应用程序 [例如 fdisk]。但它需要库来执行。我正在寻找实用程序/工具,它将帮助我从安装的二进制文件中创建一个静态二进制文件。这样我就可以在任何地方使用它。

我找到的唯一可靠的工具ErmineLight来自 这里,但这是共享软件。

是否有任何开源软件可用于相同的?

EDIT fdisk 只是一个例子。我大部分时间都在 LFS 上工作,所以如果我必须使用任何实用程序,我需要按照以下步骤操作

  1. 下载源码
  2. 配置
  3. 制作
  4. 做测试
  5. 进行安装,

因此,为了节省时间,我正在寻找一种解决方案,在该解决方案中,我将从 debian、fedora 或其他发行版制作静态二进制文件,在 LFS 上试用,如果它工作正常或按照我的要求,我会使用源代码进行编译。

executable linker static-linking

16
推荐指数
1
解决办法
1万
查看次数

如何获得静态 C 编译器?

我在玩 chroot 环境,我想要一个可移植的 C 编译器,这样我就可以在每个环境中轻松设置一些基本的构建工具,而不必移动太多的库。

对于我想做的事情,gcc 似乎很臃肿,但是如果构建静态 gcc 相当容易,我不会介意几十兆字节。

我也在看 Tiny C Compiler,它更小,但看起来仍然有令人印象深刻的功能集。但是,在源目录中运行 ./configure --help 没有列出任何用于静态构建 tcc 的选项,我不确定否则如何完成。

c compiler gcc static-linking

8
推荐指数
1
解决办法
1万
查看次数

静态和动态链接对起始地址的影响

我有一个简单的 C 程序。我跑:

$ gcc Q1.c -Wall -save-temps -o Q1
Run Code Online (Sandbox Code Playgroud)

然后我检查生成的可执行文件:

$  objdump -f Q1
Q1:     file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x080483b0
Run Code Online (Sandbox Code Playgroud)

然后我用静态链接编译它:

$ gcc Q1.c -Wall -save-temps -static -o Q1
Run Code Online (Sandbox Code Playgroud)

并再次检查文件:

$ objdump -f Q1
Q1:     file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048e08
Run Code Online (Sandbox Code Playgroud)

静态链接和动态链接对程序的起始地址有什么影响?起始地址是 的地址main(),对吗?

c gcc dynamic-linking static-linking

8
推荐指数
1
解决办法
1330
查看次数

为什么找不到这个库?

我对这个主题不是很了解,因此无法弄清楚为什么以下命令不起作用:

 $ gfortran -o dsimpletest -O  dsimpletest.o ../lib/libdmumps.a \ 
 ../lib/libmumps_common.a  -L/usr -lparmetis -lmetis -L../PORD/lib/ \
 -lpord -L/home/eiser/src/scotch_5.1.12_esmumps/lib -lptesmumps -lptscotch \
 -lptscotcherr /opt/scalapack/lib/libscalapack.a   -L/usr/lib/openmpi/ \ 
 -lmpi -L/opt/scalapack/lib/librefblas.a -lrefblas -lpthread
 /usr/bin/ld: cannot find -lrefblas
 collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

编译腮腺炎库时会发生这种情况。上述命令由make执行。我在正确的路径中有 librefblas.a :

$ ls /opt/scalapack/lib/ -l
total 20728
-rw-r--r-- 1 root root   619584 May  3 14:56 librefblas.a
-rw-r--r-- 1 root root  9828686 May  3 14:59 libreflapack.a
-rw-r--r-- 1 root root 10113810 May  3 15:06 libscalapack.a
-rw-r--r-- 1 root root …
Run Code Online (Sandbox Code Playgroud)

compiling make libraries linker static-linking

5
推荐指数
1
解决办法
7404
查看次数

Linux静态编译问题

我正在将测试盘构建为静态并运行

使静态

它返回以下错误

/usr/bin/ld: 找不到 -luuid

collect2: ld 返回 1 个退出状态

有什么问题?

在生成文件中,我有以下行

LIBS = -lz -lntfs -luuid -lcrypto -lext2fs -lcom_err

我在所有流动的标志上都出错

-luuid -lcrypto -lext2fs -lcom_err

compiling fedora static-linking

3
推荐指数
1
解决办法
1402
查看次数

预链接如何工作

我想知道预链接是如何工作的。如果我预链接我的整个系统然后删除 glibc,系统会在重新启动后“启动”吗?

linux dynamic-linking elf static-linking

2
推荐指数
1
解决办法
853
查看次数

通过在实际 C/C++ 源文件中包含预处理器构建指令来编译 C/C++ 代码

我有理由不想依赖特定的构建系统。我并不是要否定任何人的最爱,但我真的只想坚持编译器附带的内容。在这种情况下,GCC。Automake 有一定的兼容性问题,尤其是在 Windows 上。<3 GNU make 是如此有限以至于它经常需要用 shell 脚本来补充。Shell 脚本可以有多种形式,长话短说,可能会激怒很多人,这就是我想要做的——

主要的切入点是上帝。无论是 C 还是 C++ 源文件,它都是应用程序的中心。我不仅希望主入口点是第一个被执行的东西,我还希望它是第一个被编译的东西。让我解释 -

曾经有一段时间,专有库和闭源库很常见。多亏了苹果转向 Unix 和微软在脚下开枪,那个时代结束了。任何需要动态链接的库都可以作为应用程序的支持文件包含在内。出于这个原因,单独的 .SOs(可能还有 .DLLs ;])的构建指令都很好而且很花哨,因为它们是单独的可执行文件。任何其他库都应该静态链接。现在,让我们谈谈静态链接——

静态链接是一个真正的婊子。这就是 makefile 的用途。如果整个项目是用一种语言编写的(例如 C 或 C++),您可以将库作为头文件#include。那很好。但是现在,让我们考虑另一种情况——

假设你和我一样,无法找出 C 对字符串的困难借口,所以你决定使用 C++。但是您想使用 C 库,例如 MiniBasic。上帝帮助我们。如果 C 库的设计不符合 C++ 的语法,那你就完蛋了。这就是 makefile 出现的时候,因为您需要使用 C 编译器编译 C 源文件,并使用 C++ 编译器编译 C++ 源文件。我不想使用makefile。

我希望有一种方法可以利用 GCC 的预处理器宏来告诉它如下内容:

嗨,海合会。你好吗?如果您忘记了,您现在正在查看的这个源文件是用 C++ 编写的。你当然应该用 G++ 编译它。这个文件需要另一个文件,但它是用 C 编写的。它被称为“locats.c”。我想让你用 GCC 把那个编译成一个目标文件,我想让你用 G++ 把这个编译成主目标文件,然后我想让你把它们链接成一个可执行文件。

我怎么能用预处理器行话写这样的东西?海湾合作委员会甚至这样做吗?

programming gcc c++ linker static-linking

0
推荐指数
1
解决办法
2015
查看次数