我一直在Mac OS X 10.6上使用GCC 4.6.2.我在编译时使用-static-libgcc选项,否则我的二进制文件在系统上查找libgcc并且我不确定OS X上是否支持GCC 4.2.这样可以正常工作,但为什么我甚至需要libgcc?我读了它并且GNU文档说它包含"目标处理器不能直接执行的算术运算".我怎么知道这些操作是什么?为什么它们如此复杂以至于我需要包含这个库?为什么GCC不能直接优化代码而不必诉诸这些库函数?我有点困惑.对此有任何见解将不胜感激!
作为一个练习来更准确地学习c程序如何工作以及程序能够使用libc必须存在的最低内容级别,我自己尝试使用gas和ld主要在x86程序集中进行编程.
作为一个有趣的小挑战,我已成功组装并链接了几个链接到不同自制动态库的程序,但是我无法从头开始编写程序以使用libc函数调用而无需直接使用gcc.
我了解单个c库函数的调用约定,并通过使用objdump和readelf彻底检查了gcc编译的程序,但是在气体汇编文件中包含哪些信息以及要调用的参数方面没有任何进展在ld中成功链接到libc.有人对此有任何见解吗?
我在x86机器上运行Linux.
目标仅使用LLVM在Windows上为ARM编译C++程序.
为什么 LLVM因为许可许可.
我开始怀疑我对LLVM的理解是否正确.
在主机上做
然后在目标机器上执行.
主机 Windows 10,64bit
目标机器用手臂皮质-57打开PX
该程序
int main(int argc, char* argv[])
{
int x=41;
x++;
return x;
}
Run Code Online (Sandbox Code Playgroud)
我已经检查并编译了LLVM(使用Visual Studio 2015,发布版本,CPU = x64)
我的尝试
clang.exe -target arm -march=armv8-a -mcpu=cortex-a57 -mfloat-abi=hard -emit-llvm -c -o main.bc main.cpp
llc.exe -march=arm -mcpu=cortex-a57 -mattr=a57,armv8-a,v8 -meabi=gnu -o main.s main.bc
lld-link.exe /entry:main /machine:arm main.s
Run Code Online (Sandbox Code Playgroud)
错误
lld-link.exe: error: main.s: unknown file type
Run Code Online (Sandbox Code Playgroud)
然后我尝试在Windows上执行前端步骤,在arm机器上执行后端操作.
clang.exe -target arm -march=armv8-a -mcpu=cortex-a57 -mfloat-abi=hard -emit-llvm -c -o main.bc main.cpp
llc.exe -march=arm -mcpu=cortex-a57 -mattr=a57,armv8-a,v8 …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建 OpenWebOS,并遵循build-webos GitHub README中列出的计划。我正在使用全新的 32 位 Ubuntu 12.10 安装。事情有点坎坷。
然而,通过这里和那里的调整,我设法在出错之前达到 2500 步中的 350 步或(或其他)。问题是构建 glibc 的依赖性,它抱怨
(...)/sysdeps/i386/start.S:107: undefined reference to `__libc_csu_fini'
(...)/sysdeps/i386/start.S:108: undefined reference to `__libc_csu_init'
Run Code Online (Sandbox Code Playgroud)
在网上搜索发现,人们在不构建 glibc 本身时发生这种情况的各种情况:
ld 抱怨:在函数“_start”中,对“__libc_csu_fini”和“__libc_csu_init”的未定义引用
直接使用 ld 链接 C 程序失败,未定义对“__libc_csu_fini”的引用
但这是在构建自定义嵌入式 LIBC 期间:eglibc。所以有点不同,我能找到的最接近的案例是OpenEmbedded 列表上的这个 2009 年线程。我不知道如何在 WebOS 构建结构的令人困惑的充满“bakefile”的宇宙中将他们的补丁付诸实践,这是令人眼花缭乱的奇怪。
失败的命令行怪物我将“简化”为以下内容:
gcc -m32 -march = i586 --sysroot = / home / webos / build-webos / BUILD-qemux86 / sysroots / qemux86-tcbootstrap -nostdlib -nostartfiles -o iconv / iconvconfig -Wl,-dynamic-linker = / lib / ld …
我正在尝试创建一个没有gcc的动态链接可执行文件(elf_i386).该程序非常简单(只有printf)...这里的命令:
$ gcc -c simple.c
$ ld -o simple -dynamic-linker /lib/ld-linux.so.2 --entry main /usr/lib/crt1.o /usr/lib/crti.o simple.o -lc /usr/lib/crtn.o
Run Code Online (Sandbox Code Playgroud)
可执行文件被创建,并且文件命令和ldd命令显示正确的输出...但是当我在调用printf后启动程序时我得到了分段错误...我用objdump检查了可执行文件,我认为问题是关于dtors ...似乎编译:
$gcc -o simple simple.c
Run Code Online (Sandbox Code Playgroud)
一个部分.dtors存在,而它不存在于直接用ld创建的可执行文件中:(
有任何想法吗?