Tag: ld

目标文件为二进制代码

假设我有一个没有外部依赖的C文件,只有const数据部分。 我想编译这个文件,然后得到一个二进制blob,我可以在另一个程序中加载,其中该函数将通过函数指针使用。 我们举一个例子,这是一个虚构的二进制模块,f1.c static const unsigned char mylut[256] = { [0 … 127] = 0, [128 … 255] = 1, }; void f1(unsigned char * src, unsigned char * dst, int len) { while(len) { *dst++ = mylut[*src++]; len–; } } 我想将它编译为f1.o,然后f1.bin,并在prog.c中使用它 int somefunc() { unsigned char * codedata; f1_type_ptr f1_ptr; /* open f1.bin, and […]

覆盖静态库中的弱符号

我想从多个来源为我的项目创建一个静态.a库,其中一些定义弱函数,另一些实现它们。 比方说我有: lib1.c: void defaultHandler() { for(;;); } void myHandler() __attribute__((weak, alias (“defaultHandler”))); lib2.c: void myHandler() { /* do my stuff here */ } 然后我想把它们放到一个单独的库中,这样它对于最终应用程序来说似乎是透明的 $ ar -r libhandlers.a lib1.o lib2.o 但是在myHandler中现在有2个符号myHandler: $ nm libhandlers.a | grep “myHandler” 00000001 W myHandler 00000581 T myHandler 然后在使用lib时,弱引用被链接。 我目前唯一的解决方案是不包含在库lib2.c而是将其作为源添加到应用程序的Makefile中…这是不满意的,因为我只想提供几个库而不是一大堆文件。 –whole-archive选项也不令人满意,因为我在嵌入式系统上工作,我不想包含所有我不需要的东西。 有没有办法编译库,以便弱符号消失,如果提供强大的符号? 注意:我使用的是arm-none-eabi-gcc v4.8

为MacOSX构建,但链接针对iOS模拟器文件构建的dylib

我刚刚使用2013年4月15日的命令行工具升级到Xcode 5 beta,并在标准CMakeTestCCompiler.cmake尝试编译简单测试程序期间运行cmake构建时发出以下警告: cmake -version cmake version 2.8.11.2 ld: building for MacOSX, but linking against dylib built for iOS Simulator file ‘/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk/usr/lib/libSystem.dylib’ for architecture i386 lipo -info /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk/usr/lib/libSystem.dylib Non-fat file: libSystem.dylib is architecture: i386 编译步骤是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk -o /Users/temp/testCCompiler.co -c /Users/temp/testCCompiler.c lipo -info /Users/temp/testCCompiler.co Non-fat file: testCCompiler.co is architecture: i386 链接步骤是: /usr/local/bin/cmake […]

符号etext,edata和end定义在哪里?

这是来自Linux手册页的代码: #include #include extern char etext, edata, end; int main() { printf(“First address past:\n”); printf(” program text (etext) %10p\n”, &etext); printf(” initialized data (edata) %10p\n”, &edata); printf(” uninitialized data (end) %10p\n”, &end); exit(EXIT_SUCCESS); } 运行时,下面的程序产生如下输出: $ ./a.out First address past: program text (etext) 0x8048568 initialized data (edata) 0x804a01c uninitialized data (end) 0x804a024 etext , edata […]

如何创建静态链接共享库

对于我的硕士论文,我正在尝试为ARM Cortex-M3嵌入式系统调整共享库方法。 由于我们的目标板没有MMU,我认为使用“普通”动态共享库是没有意义的。 因为.text是直接从flash执行的,并且.data在启动时被复制到RAM,所以我无法解决相对于代码的.data,因此GOT也是如此。 必须通过必须在链接时定义的绝对地址来访问GOT。 那么为什么不在链接时为所​​有符号分配固定的绝对地址……? 从“链接器和加载器”一书中我了解到“静态链接共享库,即库中程序和数据地址在链接时绑定到可执行文件的库”。 链接的章节描述了如何创建这样的库,并提供对Unix System V,BSD / OS的引用; 还提到了Linux和它的uselib()系统调用。 不幸的是,本书没有提供如何实际创建诸如工具和/或编译器/链接器开关之类的库的信息。 除了那本书之外,我几乎没有找到任何关于这些“野外”图书馆的信息。 我在这方面唯一发现的是Linux的预链接 。 但是,由于这是在“正常”动态库上运行,而不是我正在寻找的。 我担心这些库的使用非常具体,因此不存在创建它们的常用工具。 虽然在这种情况下提到的uselib()系统调用让我感到疑惑。 但是我想确保在开始破解我自己的链接器之前我没有忽略任何东西……;)那么有人能给我更多关于这些库的信息吗? 此外,我想知道是否有任何gcc / ld开关链接和重定位文件,但保留文件中的重定位条目 – 以便它可以重新重新定位? 我找到了“-r”选项,但完全跳过了重定位过程。 有没有人有想法? 编辑: 是的,我也知道链接器脚本。 使用gcc libfoo.c -o libfoo -nostdlib -e initLib -Ttext 0xdeadc0de我设法得到某种链接和重定位的目标文件。 但到目前为止,我还没有找到任何可能将主程序与此链接并将其用作共享库的可能性。 (链接动态共享库的“正常方式”将被链接器拒绝。)

如何使用自定义版本的glibc和静态链接构建C程序?

我已经构建了glibc 2.14并将其安装在目录~/GLIBC/glibc_install 。 现在我想使用这个C库而不是系统的默认C库来构建和运行程序。 为了确保我正在使用我的自定义glibc,我添加了一个调用glibc/stdio-common/printf.c:__printf到glibc/stdio-common/printf.c:__printf来打印消息。 然后我重建并重新安装了glibc。 然后我写了一个“Hello,World”程序,并尝试编译并链接如下: gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c 但是我得到以下链接器错误报告: /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start’: (.text+0x19): undefined reference to `__libc_csu_init’ /usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start’: (.text+0x25): undefined reference to `__libc_start_main’ /tmp/ccACTQEp.o: In function `main’: c1.c:(.text+0xa): undefined reference to `puts’ collect2: ld returned 1 exit status 我究竟做错了什么?

直接将C程序与ld链接失败,未定义引用`__libc_csu_fini`

我正在尝试在Linux下编译一个C程序。 然而,出于好奇,我正在尝试手动执行一些步骤:我使用: gcc前端生成汇编代码 然后运行GNU汇编程序以获取目标文件 然后将其与C运行时链接以获取可用的可执行文件。 现在我被连接部分困住了。 该程序是一个非常基本的“Hello world”: #include int main() { printf(“Hello\n”); return 0; } 我使用以下命令来生成汇编代码: gcc hello.c -S -masm=intel 我告诉gcc在编译后退出并使用Intel语法转储汇编代码。 然后我使用GNU汇编程序来生成目标文件: as -o hello.o hello.s 然后我尝试使用ld生成最终的可执行文件: ld hello.o /usr/lib/libc.so /usr/lib/crt1.o -o hello 但我不断收到以下错误消息: /usr/lib/crt1.o: In function `_start’: (.text+0xc): undefined reference to `__libc_csu_fini’ /usr/lib/crt1.o: In function `_start’: (.text+0x11): undefined reference to `__libc_csu_init’ 符号__libc_csu_fini/init似乎是glibc的一部分,但我无法在任何地方找到它们! 我尝试使用相同的结果静态链接libc(针对/usr/lib/libc.a […]

如何在静态库中使用gcc链接强符号来覆盖弱符号?

我的问题可归纳如下: bar.c : #include void bar() { printf(“bar\n”); } main.c : #include void __attribute__((weak)) bar() { printf(“foo\n”); } int main() { bar(); return 0; } Makefile : all: gcc -c bar.c ar -rc libbar.a bar.o gcc main.c -L. -lbar 输出 : $ ./a.out foo 所以main.c中的弱符号栏不会被bar.c中的强符号覆盖,因为bar.c被链接到静态库libbar.a中的main.c. 我怎么能告诉gcc在libbar.a中使用强符号来覆盖main.c中的弱符号?

如何链接到其他libc文件?

我想提供共享库以及我的程序,而不是因为版本差异而使用目标系统。 ldd说我的程序使用这些共享库: linux-gate.so.1 => (0xf7ef0000)**(made by kernel)** libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)** /lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)** 我通过编译成功链接了ld-xxx.so: gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c 但我没有成功链接libc-xxx.so 。 我怎样才能做到这一点 ?

获取可执行文件中文本部分的开始和结束地址

我需要获取可执行文件部分的开始和结束地址。 我怎么才能得到它? 我可以从_init符号或_start符号获取起始地址,但是结束地址呢? 在开始.rodata部分之前,我应该考虑text部分的结束地址是最后一个地址吗? 或者我应该编辑默认的ld脚本并添加我自己的符号来指示文本部分的开头和结尾,并在编译时将其传递给GCC? 在这种情况下,我应该在哪里放置新符号,我应该考虑init和fini部分吗? 获取文本部分的开始和结束地址的好方法是什么?