Tag: 链接器

gcc链接器获取未使用对象的列表

我想在具有许多库的大型C应用程序中识别未使用的目标文件。 随着时间的推移,该项目已经发展很多,现在我想搜索不再使用的库,以便我可以从依赖文件中删除它们。 是否可以使用gcc链接器识别未使用的任何对象? 例如,如果我使用gcc编译应用程序,并且假设没有使用library2的符号/函数。 有没有办法获取有关哪些对象未链接的信息? gcc library1.o library2.o main.o -o main.elf 我知道gcc有编译器和链接器标志来删除未使用的符号: -fdata-sections -ffunction-sections -Wl,–gc-sections 但是这种方式我不知道gcc删除了哪些对象。 如果gcc可以选择获取未链接到应用程序的对象列表,那将是完美的。 仅举几个:我需要基于目标文件而不是基于function/符号! 有没有人知道gcc的这种选择?

为已弃用的函数生成链接时错误

有没有办法使用gcc和GNU binutils来标记某些函数,以便它们在链接时会产生错误(如果使用的话)? 我的情况是我有一些库函数,我不是为了与现有的二进制文件兼容而删除,但我想确保没有新编译的二进制文件尝试使用这些函数。 我不能只使用编译时gcc属性,因为违规代码忽略了我的标题,并使用configure脚本检测函数的存在并自行对其进行原型设计。 我的目标是为错误的configure脚本生成链接时错误,以便它们停止检测函数的存在。 编辑:一个想法..将使用程序集指定入口点的错误.type与动态链接器兼容但在尝试链接新程序时生成链接错误?

makefile混淆中的链接器库路径

我已经编程了一段时间,但我仍然不完全理解链接器的行为方式。 例如,今天我下载并安装了一个我想在Linux应用程序中使用的库。 (这是Xerces – 用于解析XML文件)。 我创建了一个makefile,并在其命令中为它提供了.so和.a文件的路径:-L / usr / local / lib,并且还告诉它要包含的库的名称:-lxerces-c-3.1。 我的应用程序编译正常但在运行时失败“无法打开共享对象文件libxerces-c-3.1.so”。 当我在makefile中正确地给出路径和名称时,为什么会出现这种情况? 然后我将库路径添加到我的.bashrc文件中的LD_LIBRARY_PATH变量,然后它工作。 这很好,但如果我现在删除我的makefile中的库的路径,甚至不包括库的名称,它仍然有效。 我很困惑这里发生了什么。 如何通过分配LD_LIBRARY_PATH变量的路径仍然可以找到正确的库,并且只有在我这样做的情况下才能工作? 我在别处读过甚至不使用LD_LIBRARY_PATH。 我很感激任何答案。 问题有点长,希望不是偏离主题,但我希望其他人也可以从中学习。 谢谢

GCC – 如何阻止malloc被链接?

我正在努力将我的代码缩小到最小的裸骨大小! 我使用的STM32F0只有32k闪存,需要大部分闪存用于数据存储。 我的代码已经有大约20k的闪存大小! 其中一些原因是由于使用了STM32 HALfunction,我可以根据需要对其进行解释和优化。 但是,我最大的flash消费者是所有隐含的库例程。 我似乎无法删除这些function。 它们不会在我的代码或任何HAL代码中的任何位置调用。 诸如_malloc_r(1.3k字节)和__vfiprintf_r(3kB)以及许多其他function正在使用我的闪存的很大一部分。 我认为这些都是libc函数。 我不使用这些并希望它们消失! 有谁知道如何删除这些? 我尝试了不同的优化级别和链接器选项但到目前为止没有运气。 我试过-nostdlib和–specs = nosys.specs没有变化。 如果我删除我的文件与_exit等函数的定义我得到一个链接器错误,表明该库仍然包含在内,需要这些。 链接器映射也确认存在许多不需要的function! 有什么建议?

头文件中的函数原型与定义不匹配,如何捕获这个?

(我发现这个问题类似但不重复: 如何检查C编程语言中头文件的有效性 ) 我有一个函数实现,以及一个头文件中的不匹配原型(同名,不同类型)。 头文件包含在使用该函数的C文件中,但不包含在定义该函数的文件中。 这是一个最小的测试用例: header.h: void foo(int bar); FILE1.C: #include “header.h” int main (int argc, char * argv[]) { int x = 1; foo(x); return 0; } 文件2.c: #include typedef struct { int x; int y; } t_struct; void foo (t_struct *p_bar) { printf(“%x %x\n”, p_bar->x, p_bar->y); } 我可以使用VS 2010编译它,没有任何错误或警告,但毫不奇怪,当我运行它时会出现段错误。 编译器很好用(我明白了) 链接器没有捕获它(我有点惊讶) 静态分析工具(Coverity)没有抓住它(我非常惊讶)。 […]

使用gcc,严格包含C99符号,特别是不包括POSIX

经过多年的编程,我正在修课。 我的导师没有使用POSIX机器,最近我因在作业中使用indexfunction而受到惩罚。 我做了一些研究,我注意到虽然index是AT&T Unix的早期部分,并且符合POSIX标准,但它不是C99标准的一部分。 我希望gcc帮我找到类似符号的用法 。 我正在使用gcc 4.2( 不是 llvm)在OSX上编译 我的第一站研究涉及注意我的string.h文件在下面的特征测试宏检查中包装index的原型: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 经过一番挖掘,我发现了这个(在我的/usr/include/sys/cdefs.h ): /* STRICT Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the * available APIs to exactly the set of APIs defined by the * corresponding standard, based on the value defined. * * A correct, portable definition for _POSIX_C_SOURCE is 200112L. […]

无法识别的仿真模式:MinGW32上的elf_i386

我正在尝试创建一个内核,我无法将C输出与程序集链接起来。 ld 。 我收到了错误: 无法识别的仿真模式:elf_i386 我正在使用Windows 10专业版与MinGW32和MSYS。 我正在使用的代码: link.ld /* * link.ld */ OUTPUT_FORMAT(elf32-i386) ENTRY(start) SECTIONS { . = 0x100000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } } kernel.c /* * kernel.c */ void kmain(void) { const char *str = “my first kernel”; char *vidptr = (char*)0xb8000; […]

如何将来自不同.a文件的数据收集到一个数组中? 如何使用ld脚本保留.a文件中的节?

我需要从不同的.a文件中收集一些数据到一个数组。 我通过收集数据到一个部分来做到这一点 第一个.c文件 TArElement __attribute__((section(“.my.special.section”))) uwiveuve = { … 第二个.c文件 TArElement __attribute__((section(“.my.special.section”))) egwegwxb = { … 等等 在ld脚本中 __my_mega_array_begin = ABSOLUTE(.); KEEP(*(.my.special.section)) __my_mega_array_end = ABSOLUTE(.); 在主.c文件中 extern TArElement *__my_mega_array_begin extern TArElement *__my_mega_array_end const t_size array_size = __my_mega_array_end – __my_mega_array_begin; 所以任何人都可以将他的代码链接到我的代码,我的代码将知道他的代码中的数据。 好吧,它可以工作,但实际上并不…问题是KEEP指令完全与.o文件一起工作,但不是.a。 如果在.a文件中的特定.o文件中没有使用任何部分,那么即使使用KEEP指令,整个.o文件也将从链接中丢弃。 对ld使用–whole-arhive选项会有所帮助,但出于某些原因我不允许使用此选项。 我应该只使用ld脚本文件… 解决问题的另一种方法是通过创建可重定位文件来使用部分链接。 因此.a文件中的所有.o文件都将链接到一个.o文件。 但我也不允许使用部分链接。 所以我应该只使用ld脚本并使用.a文件。

更多GCC链接时间问题:对main的未定义引用

我正在为Cortex-A8处理器编写软件,我必须编写一些ARM汇编代码来访问特定的寄存器。 我正在使用gnu编译器和相关工具链,这些工具安装在带有Ubuntu的处理器板(Freescale i.MX515)上。 我使用WinSCP和PuTTY终端从我的主机PC(Windows)连接到它。 像往常一样,我开始使用一个带有main.c和functions.s的简单C项目。 我使用GCC 编译 main.c,使用as 汇编 functions.s并再次使用GCC 链接生成的目标文件,但在此过程中我得到了奇怪的错误。 一个重要发现 – 同时,我发现我的汇编代码可能有一些问题,因为当我使用命令as -o functions.o functions.s单独组装它时,尝试运行生成的函数。使用./functions.o命令,bash shell无法将此文件识别为可执行文件(在按Tab键function时。未选中/ PuTTY未突出显示该文件)。 任何人都可以建议这里发生什么? 在链接过程中,我是否需要向GCC发送任何特定选项 ? 我看到的错误是奇怪的,超出了我的理解,我不明白GCC所指的是什么。 我在这里粘贴main.c,functions.s,Makefile和错误列表的内容。 请帮忙!!! 根据人们的建议编辑makfile之后包含的最新错误 – ubuntu@ubuntu-desktop:~/Documents/Project/Others/helloworld$ make gcc -c -mcpu=cortex-a8 main.c as -mcpu=cortex-a8 -o functions.o functions.s gcc -o hello main.o functions.o functions.o: In function `_start’: (.text+0x0): multiple definition of `_start’ /usr/lib/gcc/arm-linux-gnueabi/4.3.3/../../../crt1.o:init.c:(.text+0x0): first defined […]

OpenMP库规范

我是新手打开mp,我尝试从官方网站上的示例程序 #include #include int main() { #pragma omp parallel printf(“Hello from thread %d, nthreads %d\n”, omp_get_thread_num(), omp_get_num_threads()); } 我已经在eclipse中将库设置为项目属性 – > GCC c ++链接器中的libgomp- 但程序说/usr/bin/ld: cannot find -llibgomp我能知道我哪里错了