gpt4 book ai didi

c - 针对没有源代码的 .so 文件的 GCC 链接

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:35 24 4
gpt4 key购买 nike

我正在尝试为 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 编译的 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 工作?

最佳答案

关于:

cris-gcc -g -static -nostdlib -o compiled main.c -luClibc-0.9.27 -L.

链接器按照遇到它们的顺序处理库。所以它们必须按需要的顺序列出。

链接器在知道要检查哪个库之前需要知道库的位置。建议:

cris-gcc -g -static -nostdlib -o compiled main.c -L.  -luClibc-0.9.27 

但是,*.so 库不是静态库。它是一个动态库,所以选项:-static应该删除 但是,这要求动态库在“运行时”可用,如果相关的 *.a(静态库)可用,那么它应该在编译/链接语句中使用。

注:函数:exit()通过 stdlib.h 暴露了它的原型(prototype)头文件,而不是 unistd.h头文件。

关于:

#include <unistd.h>

int main(int argc, char** argv)
{
*((unsigned int*)0) = 0xDEAD;
}

参数:argcargv未使用,因此编译器将输出两个关于“未使用的参数”的警告语句。建议使用函数签名:int main( void )

此代码试图写入地址 0。但是,应用程序不“拥有”地址 0(通常,这样的地址将被“标记”为“只读”,因此应用程序将以“seg”退出故障事件')

包含那些不被使用的内容的头文件是糟糕的编程习惯。建议删除语句:#include <unistd.h>

此语句:int a = 0;将导致编译器输出有关“设置”但从未“使用”的变量的警告消息

关于:

cris-gcc -g -static -nostdlib -o compiled main.c -L. -luClibc-0.9.27

编译时,应始终启用警告,然后修复这些警告。建议:

cris-gcc -Wall -Wextra -Wconversion -pedantic -std=c99 -g -static -nostdlib -o compiled main.c -luClibc-0.9.27 -L.    

关于c - 针对没有源代码的 .so 文件的 GCC 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56724268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com