Tag: ld

静态编译libc C代码和ASM代码

我有ASM代码: extern my_func extern printf extern exit global _start section .data … section .text _start: … call printf … call my_func … call exit 和C代码: int my_func(int a, int b) { return a+b; } 我在64位机器上使用fedora。 我希望可执行文件是32位。 对于动态链接我做: nasm -f elf32 asm.asm ; this gives me asm.o gcc -m32 -Wall -c c_code.c ; this gives me […]

我在C程序中返回1退出状态错误

我正在尝试制作一个游戏,你需要找到1 100之间的密码,如果你找不到它,程序会告诉你它是大还是小。 这是代码: #include #include #include int main ( int argc, char** argv ) { int nombreMystere = 0, nombreEntre = 0; const int MAX = 100, MIN = 1; srand(time(NULL)); nombreMystere = (rand() % (MAX – MIN + 1)) + MIN; do { printf(“Quel est le nombre ? “); scanf(“%d”, &nombreEntre); // On compare […]

编译C代码时缺少库问题:ld找不到库

我正在尝试编译一些我从同事那里inheritance的C代码。 我遇到了一些丢失的库问题 – 也就是说,make的输出是 gcc -L. -L/lib -L/lib -L/lib -L/lib64 -o gnd2fmdpara gnd2fmdpara.o git_version.o -lfmd -lnumerics -lmisc -llapack -lblas -lgfortran -lm -lz /usr/bin/ld: cannot find -llapack /usr/bin/ld: cannot find -lblas /usr/bin/ld: skipping incompatible /lib/libm.so when searching for -lm 我已将LAPACK和BLAS内容所在的库放在PATH上,重要的是LD_LIBRARY_PATH,但仍然遇到同样的错误。 任何人都可以建议我如何帮助我的Makefile找到丢失的库? 非常感谢!

Android NDK链接问题

我用NDK编译了Sox等人。 所以,我有所有Android友好的共享库。 我做了一个调用sox函数的简单测试文件 。 NDK构建告诉我: undefined reference to `sox_open_read’ sox_open_read在sox.h中定义。 我知道它找到了sox.h,因为它给了我一个关于该文件的警告: In file included from (…)/sox/sox.h:19 所以也许它想在实际的libsox.so中找到sox_open_read。 好吧,我已经尝试了大约100种不同的方法来告诉它sox共享库的位置 LOCAL_SHARED_LIBRARY := sox LOCAL_LDLIBS := -L$(LOCAL_PATH_FULL)/jni/libs/libsox.so 但是,如果我将Sox指定为静态库,它将起作用: #LOCAL_SHARED_LIBRARY := sox LOCAL_STATIC_LIBRARIES := sox LOCAL_LDLIBS := -L$(LOCAL_PATH_FULL)/jni/libs/libsox.so 这是我的理解,我不想静态链接到sox库 – 我想动态链接到它。

使用gnu链接器更改入口点

我有一个带有_start标签的程序集文件,作为.text段中的第一个东西。 我希望这个标签成为我申请的切入点。 每当我将此文件与另一个具有main函数的文件一起传递时,无论如何,该main函数最终都成为我的应用程序的入口点。 我正在使用GNU链接器并尝试了-e _start标志,同时更改了输入文件顺序。 只要存在一个main函数,它就会成为入口点。如果我重命名main函数,它工作正常,我的_start标签成为入口点。 编辑:似乎是因为编译器的-O2标志。 屁股 .text .global _start _start: jmp main main.c中 int main(){ return 0; } 编 gcc -O2 -c as.s -o as.o gcc -O2 -c main.c -o main.o ld -e _start as.o main.o -o test 产量 00000000004000b0 : 4000b0: 31 c0 xor %eax,%eax 4000b2: c3 retq 00000000004000b3 : 4000b3: e9 […]

交叉编译为什么不能找到共享库/如何进一步调试?

我试图在ubuntu上为我的arm-router交叉编译和链接聚合,我得到以下错误。 在过去,我认为我已经能够通过设置适当的环境变量来解决这个问题,但这次没有用。 任何人都可以帮我弄清楚为什么这可能不起作用: /home/ubuntu/Downloads/toolchain-arm_cortex-a9_gcc-4.9-linaro_musl-1.1.2_eabi/bin/../lib64/gcc/arm-openwrt-linux-muslgnueabi/4.9.1/../../../../arm-openwrt-linux-muslgnueabi/bin/ld: cannot find -lpopt 但是libpopt.so存在于:lrwxrwxrwx lrwxrwxrwx 1 root root 34 Sep 10 12:46 /lib/x86_64-linux-gnu/libpopt.so -> /lib/x86_64-linux-gnu/libpopt.so.0 我按照绝望的顺序设置以下环境变量无济于事。 LIBRARY_PATH=/lib/x86_64-linux-gnu/ LD_LIBRARY_PATH=/lib/x86_64-linux-gnu/ PATH=/lib/x86_64-linux-gnu/:/usr/include/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 认为它可能是因为它可能是目标架构问题(也许我需要为交叉编译的目标构建libpopt.so)而导致我将libpopt.so从路由器复制到我的ubuntu并再次设置路径。 再无济于事。 我可能做错了什么? 谢谢

ld抱怨:在函数“_start”中,未定义引用“__libc_csu_fini”和“__libc_csu_init”

我用clang而不是gcc编译了一个GTK +程序。 到目前为止这么好,除了我没有正确的ld链接。 原来的makefile叫做gcc来做链接,如下所示: gcc -g -O2 -export-dynamic -o my_application somefile.o another.o -pthread -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgconf-2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0 如果我只是在上面的命令中用gng替换gcc ,我会从后者那里得到这个警告: clang:warning:编译过程中未使用的参数:’ […]

链接器错误 – 尝试链接arm,但链接器使用x86

我试图将这个C库交叉编译为iOS库,即用于armv7机器。 我正在使用OSX机器来编译库。 该项目设置为使用Autoconf – 这是我正在使用的选项: ./configure –host=arm-apple-darwin –prefix ~/dev/xmlrpc-c-1.25.28/iOS_bin_arm CFLAGS=”-arch armv7s -isysroot /Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=4.0″ –disable-curl-client –disable-cplusplus LDFLAGS=’-arch armv7s -miphoneos-version-min=4.0 –sysroot /Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk’ 编译好了。 问题发生在链接阶段: ld: warning: ignoring file parse_datetime.osh, file was built for armv7s which is not the architecture being linked (x86_64): parse_datetime.osh ld: warning: ignoring file parse_value.osh, file was built for armv7s which is not […]

什么是绝对符号以及如何在C中定义它?

在nm的手册页中。 它说 “A”符号的值是绝对值,不会因进一步链接而改变。 但是,我不知道这意味着什么。 如何定义变量或其他东西以使其值在C中绝对? 如果我在test.c中的文件范围中声明一个变量 int a; 然后在nm的输出中,a的条目将在我的机器上进行以下操作 0000000000000004 C a 所以我想知道我该怎么做才能使变量的nm输出为“A”。 我不知道“绝对”是什么意思。

如何列出链接器分配的代码对象w / gcc?

我正在构建一个由几个代码模块和一个静态库组成的嵌入式应用程序。 一些全局变量显式放在专用内存部分(即,不是默认的.data部分)。 处理器内存架构是4个库,创建了连续的物理内存空间。 在我的应用程序中,只有第一个库被保留用于代码,而其他3个库被保留用于显式分配的全局和一个小堆栈。 问题是代码部分(.text)现在超出了第一个库边界,我得到以下链接器错误消息: ./bin/ld: section .data_bank1 loaded at [0000000000002000,0000000000003fff] overlaps section .text loaded at [0000000000000630,00000000000020df] ./bin/ld: section .fini loaded at [00000000000020e0,00000000000020f9] overlaps section .data_bank1 loaded at [0000000000002000,0000000000003fff] 有没有办法在链接器检查节和对象重叠之前查看对象分配(可能在临时对象文件中),并中止构建?