【发布时间】:2019-06-23 13:18:31
【问题描述】:
我正在尝试为 Axis A210(cris 架构)编译一个简单的“hello world”程序。我设法从供应商那里下载了 GCC,但它带有 glibc,并且相机运行的是 uClibc-0.9.27。我从设备中提取了文件/lib/libuClibc-0.9.27.so。
我设法编译了这个有段错误的程序:
#include <unistd.h>
int main(int argc, char** argv)
{
*((unsigned int*)0) = 0xDEAD;
}
这个刚刚挂起的程序:
#include <unistd.h>
int main(int argc, char** argv)
{
int a = 0;
}
cris-gcc -g -static -nostdlib -o compiled main.c.
现在我想使用 libuClibc 中的函数,但我似乎无法让链接正常工作:我已经尝试过
cris-gcc -g -static -nostdlib -o compiled main.c -luClibc-0.9.27 -L.
但这只是给出:
./libuClibc-0.9.27.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
有没有办法链接到这个.so 文件或以其他方式使exit 等一些标准功能正常工作?
【问题讨论】:
-
您还需要使用交联剂。您可以通过
-B选项提供指向gcc的链接器路径。检查哪个链接器可执行文件与gcc -v或strace一起使用(IIRC,前者无法输出ld调用——但它确实输出了collect2的调用,这是ld的一个瘦包装器)。 -
@VladislavIvanishin 我认为它使用了正确的链接器(但我不确定):
strace的输出显示stat64("/usr/local/cris/lib/gcc-lib/cris-axis-elf/3.2.1/collect2", {st_mode=S_IFREG|0755, st_size=85464, ...}) = 0,我认为这是正确的路径 -
目前还不清楚。这只是编译器附带的
collect2包装器的路径。然后它应该调用链接器(很可能是ld或ld.bfdmb 也带有某些后缀),该链接器与 binutils 包一起单独提供。 -
@VladislavIvanishin 链接步骤似乎有问题:运行
cris-gcc -g -static -nostdlib -o compiled.o main.c -c后,我运行cris-ld -o linked compiled.o libuClibc-0.9.27.so并给出相同的错误。 -
cris-nm、cris-objdump或cris-readelf是否能够读取来自libuClibc-0.9.27.so的符号?
标签: c gcc cross-compiling ld uclibc