Tag: 链接器

从C中同一目录中的另一个文件调用函数

我正在学习C,但我对Java等高级编程语言有很长的经验。 我正在阅读有关头文件的内容,所以我正在玩它们,但是我注意到我可以从另一个文件调用一个函数而不用#including它(它在同一个目录中),这怎么可能?! 是make文件,配置那种方式的链接器还是什么? 我们有两个文件 main.c add.c main.c从add add.c调用函数add(int x,int y) ,但是在#including add.c之前我错误地编译了它并且它工作了! 更令人困惑的是,当我#include add.c时,它会在函数add上产生多重定义错误

手动指定特定链接符号的重新映射

如果不修改这两个源文件,有没有办法通过编译它们来获取生成的目标文件,并说服链接器将main_v1.c中的foo链接到bar.c中的bar ? main_v1.c void foo(void); int main(void) { foo(); } bar.c #include void bar(void) { puts(“bar()!”); } 修改目标文件本身是公平的游戏,但假设我们甚至可能没有可用的源代码。 该平台是Linux。 通过坚持对main_v1.c的适度更改,并链接到一个额外的“映射”对象文件,这里几乎可以用标准C获得所需的结果。 main_v2.c extern void (*const foo)(void); int main(void) { foo(); } bar.c没有变化。 map.c void bar(void); void (*const foo)(void) = bar; 如果使用lto编译目标文件,则甚至可以省略函数指针取消引用(使用最近的gcc)。 这是一个非常好的结果但是如果修改main()以直接调用bar() ,那么bar()本身在链接后内联,因此还有改进的余地。

链接器脚本.relocate部分的第一个符号_srelocate是不正确的(GCC Bug?)

问题 我的问题是,当我使用以下脚本打算将代码放入RAM时,重定位部分会填充虚假数据。 我的问题是: 为什么_srelocate符号比_srelocate符号大4个字节? 它们不应该是一样的吗? 另外,如果1.的答案为NO,我不应该从_etext + 4复制到_srelocate吗? 背景和相关代码 我正在使用Atmel ATSAM3N4X系列处理器(ARM Cortex M3),并希望对我的链接器脚本和.relocate部分初始化有所帮助。 原因是_etext符号比_srelocate符号小4个字节。 以下链接描述文件是Atmel Studio 6生成的默认脚本(如果您希望ram / rom符号位置看到问题的Apendix )。 /* —————————————————————————- * SAM Software Package License * —————————————————————————- * Copyright (c) 2012, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, […]

如何将库定义的符号加载到指定的位置?

测试在Ubuntu 12.04,32位, gcc 4.6.3。 基本上我正在对ELF二进制文件进行一些二进制操作工作,我现在要做的是组装一个汇编程序并保证libc符号被我加载到预定义的地址。 让我在一个简单的例子中详细说明。 假设在原始代码中使用了libc符号stdout@GLIBC_2.0 。 #include int main() { FILE* fout = stdout; fprintf( fout, “hello\n” ); } 当我编译它并使用以下命令检查符号地址时: gcc main.c readelf -s a.out | grep stdout 我懂了: 0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@GLIBC_2.0 (2) 0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@@GLIBC_2.0 和.bss部分是这样的: readelf -S a.out | grep bss [25] .bss […]

从GCC链接到winmm.dll

我想使用gcc中的mciSendString来构建一个dll,所以我需要链接到winmm.dll库。 我试过这样的事情: gcc -c -o dllTest.o dllTest.c -lC:\Windows\System32\winmm.dll 但是当我尝试构建dll时,我得到了mciSendString的未定义引用。 从gcc链接到winmm的正确方法是什么?

链接到库时,include和link之间有什么区别?

什么包括和链接真的吗? 有什么区别? 为什么我需要指定它们? 当我写#include math.h然后编写-lm来编译它时, #include math.h和-lm分别做了什么? 据我所知,在链接库时,您需要其.h文件及其.o文件。 这是否建议#include math.h意味着接受.h文件而-lm接收.o文件?

‘main’通常是一个非静态函数ERROR

有两个错误出现:main.c:80:警告:’main’通常是一个非静态函数main.c:88:错误:输入结束时的预期声明或语句我似乎无法找到问题……花括号的数量相等……似乎有什么问题? #include #include #include #include #include #include “main-getopt.h” void print_usage_and_abort( const char *message ) { if( NULL != message ) fprintf( stderr, “Error: %s\n”, message ); fprintf( stderr, “Usage: partitioner -n [ -f ]\n\n” ); exit( -1 ); } void parsing (int argc, char **argv, struct Params *params) { char error_message[256]; params->nodes = 0; memcpy( […]

目标文件“Version References”来自哪里?

目前我在一个目录中有一个文件libshared-object.so (名称已更改为通用性)。 当我跑 $ objdump -p libshared-object.so 我收到以下输出: libshared-object.so: file format elf64-x86-64 Program Header: LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21 filesz 0x00000000000828ee memsz 0x00000000000828ee flags rx LOAD off 0x0000000000083768 vaddr 0x0000000000283768 paddr 0x0000000000283768 align 2**21 filesz 0x00000000000048e0 memsz 0x0000000000004af0 flags rw- DYNAMIC off 0x0000000000084af0 vaddr 0x0000000000284af0 paddr 0x0000000000284af0 align 2**3 filesz 0x00000000000002a0 […]

为什么运行时库是编译器选项而不是链接器选项?

我正在尝试使用visual studio 2005构建一个C / C ++静态库。由于运行时库的选择是一个编译选项,我不得不构建我的库的四个变体,一个用于运行时库的每个变体: / MT – 静态运行时库 / MD – DLL运行时库 / MTd – 调试静态运行时库 / MDd – 调试DLL运行时库 这些是编译器选项,而不是链接器选项。 来自Linux背景,这看起来很奇怪。 不同的运行时库是否有不同的调用约定? 为什么不能在链接时解析不同的运行时库,即当我链接使用我的静态库的应用程序时?

未找到链接到头文件的头文件。

我对Nvidia的OpenCl / Cuda框架有疑问,但我认为这是一个gcc链接问题。 opencl_hello_world.c示例文件使用以下头文件: #include “../OpenCL/common/inc/CL/opencl.h” 使用这些头文件的opencl.h : #include #include #include #include 所以所有头文件都在同一个文件夹中。 当我用gcc opencl_hello_world.c -std=c99 -lOpenCL编译时,我收到以下错误消息: error: ../OpenCL/common/inc/CL/cl.h: No such file or directory error: ../OpenCL/common/inc/CL/cl_gl.h: No such file or directory … 即使cl.h和其他头文件位于此文件夹中。 搜索过SO之后,我将opencl.h的包含更改为 #include “cl.h” #include “cl_gl.h” 我在这里阅读: gcc无法找到包含的标题 。 但是搞乱框架头文件似乎不怎么样? 处理这个问题的正确方法是什么?