我正在部署一个用gcc编译的小程序,4.3.2-1.1(Debian).该程序将部署在虚拟机模板上,范围从Debain 5到最前沿的Fedora,Ubuntu,Slackware,Arch等.
该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用.因此,通过虚拟机模板上的相应软件包管理器安装Xen的库无法解决我的直接问题.
在我打包这些库的自己版本之前,我需要静态链接可执行文件.
gcc 4.3-x,默认情况下只包含静态链接时实际使用的符号,还是我应该传递给链接器的另一个优化标志?我知道静态链接很糟糕,我只是作为一个临时工作.
嘿伙计们,我一直在寻找一种在(非常)大的C++项目中找到静态无法访问的函数的方法.我曾尝试使用doxygen和其他静态分析工具,但似乎项目太复杂,无法处理.最后我决定使用GCC工具(g ++,gprof,gcov等)是最安全的选择,虽然我无法弄清楚如何做到这一点.我认为g ++优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称.
你有什么建议吗?
谢谢!
我有兴趣使用Linux头文件提供的unistd.h构建一个没有(g)libc的静态ELF程序.
我已经阅读了这些文章/问题,这些文章/问题粗略地概括了我正在尝试做什么,但并不完全:http: //www.muppetlabs.com/~breadbox/software/tiny/teensy.html
https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free
我有基本代码,它只依赖于unistd.h,其中我的理解是每个函数都是由内核提供的,而且不需要libc.这是我采取的最有希望的道路:
$ gcc -I /usr/include/asm/ -nostdlib grabbytes.c -o grabbytesstatic
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400144
/tmp/ccn1mSkn.o: In function `main':
grabbytes.c:(.text+0x38): undefined reference to `open'
grabbytes.c:(.text+0x64): undefined reference to `lseek'
grabbytes.c:(.text+0x8f): undefined reference to `lseek'
grabbytes.c:(.text+0xaa): undefined reference to `read'
grabbytes.c:(.text+0xc5): undefined reference to `write'
grabbytes.c:(.text+0xe0): undefined reference to `read'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
在此之前,我必须根据内核头文件中的值手动定义SEEK_END和SEEK_SET.否则就会错误地说那些没有定义,这是有道理的.
我想我需要链接到未经剥离的vmlinux来提供符号来使用.然而,我读完了符号,虽然有很多llseeks,但他们并不是llseek逐字逐句.
所以我的问题可以在几个方面:
如何指定ELF文件以使用符号?而且我猜测是否/如何可能,符号将不匹配.如果这是正确的,是否有一个现有的头文件将重新定义llseek和default_llseek或内核中的任何内容?
有没有更好的方法在没有libc的情况下在C语言中编写Posix代码?
我的目标是使用(可能只是)unistd.h编写或移植相当标准的C代码,并在没有libc的情况下调用它.我可能没有一些unistd函数,并且不确定哪些"纯粹"存在于内核调用或不存在.我喜欢集会,但这不是我的目标.希望保持尽可能严格的C(如果必须的话,我可以使用一些外部汇编文件),以便在某些时候允许无libc的静态系统.
谢谢你的阅读!
当我讨论这个话题时,我问自己以下问题。
是否存在翻译单元中一些未使用的代码将链接到 GCC 和 VC++ 等流行编译器的最终可执行代码(当然是在发布模式下)的情况?
例如假设我们有 2 个编译单元:
//A.hpp
//Here are declarations of some classes, functions, extern variables etc.
Run Code Online (Sandbox Code Playgroud)
以及源文件
//A.cpp
//defination of A.hpp declarations
Run Code Online (Sandbox Code Playgroud)
最后是主要的
//main.cpp
//including A.hpp library
#include "A.hpp"
//here we will use some stuff from A.hpp library, but not everything
Run Code Online (Sandbox Code Playgroud)
我的问题是。如果 main.cpp 中没有使用 A.hpp 中的所有内容怎么办?链接器是否会删除所有未使用的代码,或者在某些情况下,某些未使用的代码可以与可执行文件链接?
编辑:我对 G++ 和 VC++ 链接器感兴趣。
编辑:当然我的意思是在发布模式下。
编辑:我开始为这个问题提供赏金,以获得良好而完整的答案。我期待答案,它将解释在哪些情况下 g++ 和 VC++ 链接器链接垃圾以及它们能够从可执行文件中删除什么样的代码(不需要的函数、不需要的全局变量、不需要的类定义等...)以及为什么他们不能删除一些不需要的东西。