BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为
可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当
进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用
free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量
(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,
其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把
堆栈看成一个寄存、交换临时数据的内存区。
objcopy用于将object的部分获全部内容拷贝到另一个object,从而可以实现格式的变换。
objcopy可用用于将文件转换成S-record格式或者raw二进制格式。
例如,
xxxx-elf-objcopy –O srec test.o test.s19
则将test.o转换成s-record文件中。通常涉及到text段。
xxxx-elf-objcopy –O binary test.o test.bin
则将test.o转换成raw binary文件格式。
当将object文件转换成raw binary格式时,通常将去除掉symbols和relocation信息。在生成s-record过程中,有时需要用选项“-S”,“-R”去除掉binary文件,s-record文件不需要的相应信息。
此外,还需要注意到使用objcopy不能够改变大、小endian。
| 选项 | Desc |
| infile/outfile | 源文件/目标文件 |
| -I bfdname --input-target=bfdname | 输入文件的bfdname,可取值elf32-little,elf32-big等,可用用objdump –I查看相应的信息 |
| -O bfdname --output-target=bfdname | 输出文件的bfdname |
| -F bfdname --target=bfdname | 指定输入、输出文件的bfdname,目标文件格式 |
| -j sectionname --only-section=sectionname | 只将由sectionname指定的section拷贝到输出文件 |
| -R sectionname --remove-section=sectionname | 去除掉由sectionname指定的section |
| -S --strip-all | 去掉源文件的符号信息和relocation信息 |
| -g --strip-debug | 去除掉调试符号信息和相关的段 |
| -K symbolname --keep-symbol=symbolname | 保留由symbolname指定的符号信息 |
| -N symbolname --strip-symbol=symbolname | 去除掉由symbolname指定的符号信息 |
| -G symbolname --keep-global-symbol=symbolname -L symbolname --localize-symbol=symbolname -W symbolname --weaken-symbol=symbolname -w --wildcard -x --discard-all -X --discard-locals | 处理符号 |
| -b byte --byte=byte | 每byteth byte中保留1 byte |
| -i interleave --interleave=interleave | 每隔interleave字节拷贝1 byte |
| --gap-fill val | 在section中填充val |
| --set-start val | 设定新文件的start address |
| --change-start incr --adjust-start incr | 调整start address |
| --change-address incr --adjust-vma incr | 调整所有sections的VMA(virtual memory address)和LMA(linear memory address)。 |
| --change-section-address section{=,+,-}val --adjust-section-vma section {=,+,-}val | 调整指定section的VMA/LMA地址 |
| --set-section-flags section=flag | 指定指定section的flag,flag的取值可以alloc,contents, load, noload, readonly, code, data, rom, share, debug |
| --add-section sectionname=filename | 添加一个section,该section的内容为filenmae的内容 |
| --rename-section oldname= newname[,flags] | 更改section的名 |
| -V --version | objcopy的version number |
-
顶
- 0
-
踩
内存管理在程序执行中至关重要,本文详细介绍了BSS段(未初始化全局变量)、DATA段(初始化全局变量)、CODE段(程序执行代码)的含义。同时,探讨了堆和栈在程序运行时的角色。最后,提到了objcopy工具在对象文件格式转换中的应用,如转换为S-record或raw二进制格式。
1042

被折叠的 条评论
为什么被折叠?



