gnu链接器脚本翻译
‘壹’ (ARM + Linux)GNU链接脚本中的".ARM.attributes"是什么意思
所谓gnu链接脚本,其实一般都是lds脚本,或者说是elf格式的bin文件组成的脚本文件,主要是告诉你代码是怎么排列在elf文件终,至于为啥要烧到arm,其实一般都烧录在flash中的,然后arm引导程序启动就需要从flash获取机器猫,也就是你说的那些段,常见的有data,bss,text,rely等
‘贰’ 关于编程的问题 高分
是这样的,一个编译好的可用的可执行程序,是分段的(.data段 .bss 段 .text段详细点就网络下),而这个可执行程序在被生成之前需要先将源文件(.c 文件)编译成 .o(二进制文件),而这个时候就开始了分段(上面所说的 .data段 .bss 段,.test 段),而你这种情况的出现可能是编译时的编译选项(例如着名的编译工具 gcc, gcc -c 1.c -o 1.o ,这里的 -c 就是编译选项)配置成了 -ffunction-sections -fdata-sections 造成的,这个会把每个文件的函数部分和非局部变量单独放到一个段里,经过链接(这个过程可暂不用了解)最后相同的段组合起来就成了最后的可执行文件。你现在这种情况应该是这种情况造成的。这个可以通过修改编译选项或链接脚本解决。
以上你的代码并没有明显的问题,只是头文件包含的这个文件我不太懂,可能是跑在特定平台上的,这不是重点,如果头文件不正确会报出函数未声明的警告,这不是导致这个情况发生的原因
解决办法:
1、最粗暴方法:换个编译器,windows 常用的编译器有 cl(也就是vc 6.0 什么的,大学时用的),Linux 操作系统(Ubuntu,Red hat,Centos ...)常用的 c 编译器就是 gcc c++ 编译器是 g++
2、修改链接脚本,因为看你的代码应该是跑在某个平台上的,而一般这种情况下会有自己的链接脚本,你可以在 .data 段中添加这样一句:*(.data*) 解决当前的 .data.align4 段无处可放的问题
再有问题再回复
‘叁’ 简述一下编译器和链接器的作用
1、编译器:
编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。
2、链接器:
当链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定义表,对其中记录的地址进行重定向(加上一个偏移量,即该编译单元在可执行文件上的起始地址)。
然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实现地址。最后把所有的目标文件的内容写在各自的位置上,再作一些另的工作,就生成一个可执行文件。
‘肆’ 常见的c语言编译器是什么
目前最流行的C语言编译器有以下几种:
1、GNU Compiler Collection 或称GCC
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。
GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的着名例子,由自由软件基金会以GPL协议发布。
2、Microsoft C 或称 MS C
Microsoft C 是c语言的一种IDE(集成开发环境),常见的还有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C等等......
3、Borland Turbo C 或称 Turbo C
Turbo C是美国Borland公司的产品,Borland公司是一家专门从事软件开发、研制的大公司。该公司相继推出了一套 Turbo系列软件, 如Turbo BASIC, Turbo Pascal, Turbo Prolog, 这些软件很受用户欢迎。

(4)gnu链接器脚本翻译扩展阅读:
C编译的整个过程很复杂,大致可以分为以下四个阶段:
1、预处理阶段在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所包含的文件中预定义代码的替换等,总之这步主要完成一些替换工作,输出是同源文件含义相同但内容不同的文件。
2、编译、优化阶段编译就是将第一阶段处理得到的文件通过词法语法分析等转换为汇编语言。优化包括对中间代码的优化,如删除公共表达式,循环优化等;和对目标代码的生成进行的优化,如如何充分利用机器的寄存器存放有关变量的值,以减少内存访问次数。
3、汇编阶段将汇编语言翻译成机器指令。
4、链接阶段链接阶段的主要工作是将有关的目标文件连接起来,即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的目标文件成为一个能够被操作系统装入执行的统一整体。
‘伍’ 写了一个程序可以编译c语言,怎么自动再链接然后执行生成的可执行文件
编译的大致过程如下:

你完成的其实是前面一部分,的第一阶段,生成了中间代码。
目标代码,即目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据,如重定位信息,如用于链接或调试的程序符号(变量和函数的名字),此外还包括其他调试信息。
后面是由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模块。
目前的编译工具通常编译器和链接器都是分开,例如GNU的编译器是gcc,链接器是ld
