Tag: 链接器

如何将库静态链接到另一个静态库?

我有2个不同版本的MinGW构建环境:一个配置为Qt,一个配置为不。 但是,它们都有Qt的存根静态库(最终实际链接到dll)。 问题是我想在Qt MinGW中构建一个静态库,然后将它包含在非Qt MinGW中。 我尝试时收到以下链接错误: moc_browser.cpp :(。eh_frame + 0x11):未定义引用`___gxx_personality_v0′ browser.cpp :(。text + 0x213):未定义引用`__Unwind_Resume’ 我发现Qt MinGW动态链接到标准库,我需要包含-static-libgcc选项。 但是,我不知道在哪里使用它,因为我没有构建可执行文件,而是一个静态库。

未定义的引用错误 – rand

我正在创建一个命令行C ++测试应用程序(可执行文件),在我的root设备上运行。 可执行文件使用多个预构建的C库,其中一个使用’rand()’。 在链接状态期间,我得到错误“ 未定义的’rand’参考 ” 要检查路径是否设置正确,我尝试了以下方法但没有成功。 第一种方法:我在测试源中定义了rand()。 我注意到我得到了多个定义错误,第一个定义是在bionic / libc / include / stdlib.h中 第二种方法:在我的测试应用程序中使用rand() 我注意到链接器不会在这里抱怨未定义的符号 第三种方法:取消归档和归档所有目标文件 发现我仍然得到未定义的引用错误。 当使用’rand’的C库使用C测试文件编译成可执行文件时,看不到所提到的链接器错误。 我无法修改预构建的静态库,需要将库与基于C ++的测试应用程序一起使用。 任何投入都将非常受欢迎。

在编译时重命名符号,而不以跨平台方式更改代码

在创建静态对象时,是否可以在跨平台的方式在编译时重命名符号(不更改代码)? 我最近推荐使用objcopy,但linux并不是唯一一个必须在mac上工作的目标平台。 我正在使用gcc编译,所以我希望有某种gcc选项。 我听说过.def文件,但这可能会产生误导,因为我发现的有关它们的信息似乎是针对Windows的。 编辑:我正在尝试更改C和Fortran函数的名称,特别是使用“wrap”一词预先挂起它们,以避免链接时出现符号冲突。

是否使用一个编译器与另一个编译器兼容创建静态c库

在我的例子中,我有一个使用代码源gcc定位arm cortex-m4构建的库。 我试图将该库链接到使用IAR编译器编译的项目。 是否可以这样做或者是否必须使用新工具重建库? 哪些因素会影响这个?

如何从偶数地址边界开始填充带有两个字节值的S记录?

当我编译我的代码时,我最终获得了带有间隙的摩托罗拉S记录 ( a.mot )(整个地址范围不包含在代码和数据中)。 我想用模式0x01 0x80填补这些空白。 但是,重要的是所有双字节对必须从偶数地址开始。 0x0180是我的micro的操作码,如果PC到达未使用的闪存区域的地址,我想要执行。 在你开始回答之前我想告诉你srec_cat中的-repeat -data有一个问题: 给定两个部分,例如C和D在地址空间中一个接一个地放置( C之后的D )。 假定C部分的最后一个字节在地址0x76上结束,而部分D的第一个字节在地址0x78 。 换句话说,它们之间的地址0x77处有1个字节的长间隙。 在这种情况下,如果我使用-repeat -data 0x01 0x80选项,srec cat将用0x01填充该一个字节,并从0x80开始填充以下间隙。 我不知道这些部分的大小,因为链接器处理它。

C链接器在哪种情况下会消除未使用的易失符号?

我正在使用一个非常具体的工具链(ADI公司的SHARC DSP处理器),我想更好地了解我的编译器/链接器。 我有一个易变的全局变量: volatile long foo; 这个变量没有被使用,也没有在我的代码中引用,但是我希望将它保存在我的最终可执行文件中(不要问我为什么,这个可悲的事实很难过)。 我通常用-e选项链接我的项目。 它告诉链接器从可执行文件中删除死代码。 我最初认为没有编译器敢于删除任何全局变量,特别是如果这些符号被声明为volatile。 不幸的是。 然后我找到了一个非常具体的编译指示#pragma retain_name ,它告诉链接器保留一个符号,即使它从未使用过。 我想知道在某些ISO / POSIX标准中是否可以找到这种情况。 我总是认为编译器或链接器都不会对易失符号做出任何假设。 因此,没有编译器会尝试从最终的可执行文件中删除死的volatile变量或函数。 我错了吗?

对象代码,用C语言链接时间

编译时,C在链接时间之前生成对象代码。 我想知道目标代码是否是二进制forms的呢? 如果是这样,链接时间接下来会发生什么?

来自同一个库的两个函数:为什么一个生成未定义的引用而另一个不生成?

我想在函数中用pthread_mutex_trylock替换pthread_mutex_lock,当我这样做时,我得到“未定义的引用”错误消息(见下文)。 如果我用pthread_mutex_lock(&cmd_queue_lock)替换411-13行,我就不会收到链接器错误。 它们都来自我已经包含的同一个库。 为什么一个生成链接器错误而另一个不生成? 更重要的是,我该如何解决? 我尝试添加“extern int pthread_mutex_trylock”并更改Makefile中的.o文件的顺序,但两者都不起作用。 $ nl clientmain.c 12 #include … 21 #include 411 if (pthread_mutex_trylock(&cmd_queue_lock) == EBUSY) { 412 continue; 413 } $ make clientmain.o: In function `createHC’: clientmain.c:411: undefined reference to `pthread_mutex_trylock’ collect2: ld returned 1 exit status make: *** [clientmain] Error 1

C全局静态变量初始化是由链接器完成的吗?

假设我们有: 在f1.c #include static int x = 10; void f1() { printf(“f1.c : %d\n”, x); } main.c中 extern void f1(); int main(int argc, char **argv) { f1(); return 0; } 我们将编译和读取两个ELF文件符号表(rel.ELF和exec ELF): $> gcc -c *.c $> readelf -s f1.o | grep x Num: Value Size Type Bind Vis Ndx Name 5: 0000000000000000 4 OBJECT […]

将变量放在特定地址会生成大型二进制文件

我必须将数组放在内存中的特定地址。 我正在使用GCC。 我声明变量如下: uint8_t __attribute__((section (“.mySection”))) buffer[1234]; 在链接器脚本中我得到了: MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 145K MYSEC (x) : ORIGIN = 0x20025000, LENGTH = 155K } 然后: .mySection : { *(.mySection); } > MYSEC 它当然是嵌入式系统(ARM)的代码。 通常我的程序需要22 KB,这个修改需要384 MB(!)。 我不明白为什么。 如果我删除__attribute__它再次需要22 KB。 我错过了什么? 使用的代码: […]