相关疑难解决方法(0)

在与gcc静态链接时,如何仅包含已使用的符号?

我正在部署一个用gcc编译的小程序,4.3.2-1.1(Debian).该程序将部署在虚拟机模板上,范围从Debain 5到最前沿的Fedora,Ubuntu,Slackware,Arch等.

该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用.因此,通过虚拟机模板上的相应软件包管理器安装Xen的库无法解决我的直接问题.

在我打包这些库的自己版本之前,我需要静态链接可执行文件.

gcc 4.3-x,默认情况下只包含静态链接时实际使用的符号,还是我应该传递给链接器的另一个优化标志?我知道静态链接很糟糕,我只是作为一个临时工作.

c linux gcc static-linking

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

使用GCC查找无法访问的函数("死代码")

嘿伙计们,我一直在寻找一种在(非常)大的C++项目中找到静态无法访问的函数的方法.我曾尝试使用doxygen和其他静态分析工具,但似乎项目太复杂,无法处理.最后我决定使用GCC工具(g ++,gprof,gcov等)是最安全的选择,虽然我无法弄清楚如何做到这一点.我认为g ++优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称.

你有什么建议吗?

谢谢!

c++ gcc dead-code

10
推荐指数
1
解决办法
3621
查看次数

使用Linux头文件中的unistd.h构建不带libc的静态ELF

我有兴趣使用Linux头文件提供的unistd.h构建一个没有(g)libc的静态ELF程序.

我已经阅读了这些文章/问题,这些文章/问题粗略地概括了我正在尝试做什么,但并不完全:http: //www.muppetlabs.com/~breadbox/software/tiny/teensy.html

没有libc编译

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的静态系统.

谢谢你的阅读!

linux gcc posix libc elf

10
推荐指数
2
解决办法
2428
查看次数

来自其他链接单元的垃圾

当我讨论这个话题时,我问自己以下问题。

是否存在翻译单元中一些未使用的代码将链接到 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++ 链接器链接垃圾以及它们能够从可执行文件中删除什么样的代码(不需要的函数、不需要的全局变量、不需要的类定义等...)以及为什么他们不能删除一些不需要的东西。

c++ optimization linker

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

标签 统计

gcc ×3

c++ ×2

linux ×2

c ×1

dead-code ×1

elf ×1

libc ×1

linker ×1

optimization ×1

posix ×1

static-linking ×1