C语言编译产生的.OBJ文件和汇编编译产生的.OBJ文件,如何连接_百度知道

本文介绍如何使用Turbo C的命令行工具tcc.exe进行C程序与汇编语言混合编程的编译连接。文章详细解释了命令行参数的意义,并通过多个示例展示了具体的使用方法。
导读:


rubo C的命令行编译连接

所谓命令行编译,是指在dos下,调用Trubo C的tcc.exe程序.来完成对turbo
C源程序的编译连接工作.当选择对后缀为*.asm的汇编程序文件编译时,tcc还要调用TASM后才能对后缀为.asm的文件进行编译,这种方式适合于
c程序与汇编语言混合编程的编译连接,当c程序嵌入汇编指令时,也必须用此方法编译连接。
命令行编译的格式为:

tcc [选项1 选项2 ...]文件名1
文件名2...其中选项是指对后面给出的文件进行连接时的选择项,可选的常用选择项如下所示:每个选项前都带有"-"号,且大小写是区分的。文件名是指源
文件.c或目标文件.obj或库文件.lib当不指定只编译不连接时,tcc将完成编译和连接两个步骤,对.lib库只进行形式上的连接,标准库用户不用
进行连接。
例如:

tcc -ib:/include -lb:/lib -etest start.c body.obj
myc当执行该命令时,表示将start.c源文件和body.obj目标文件及myc.c(命令行中该文件无后缀),分别进行编译(对body.obj
文件不再编译),然后连接生成名为test的执行文件test.exe(由-test给出).
-ib:/include 表示包含文件的路径是b:/include

-ib:/lib 表示库文件的路径是b:/lib

又例如:

tcc -ms -efile -lc:/tc/lib file1 file2.obj graphics.lib

其中-ms表示选择小内存模式进行编译,它也是turbo c的缺省编译模式,将file1进行编译,然后和file2.obj
及graphics.lib进行连接.生成file.exe的可执行文件.其中graphcis.lib库的路径为c:/tc/lib,即意为在c:/
tc/lib目录下去寻找graphics.lib文件.当进行混合编程时,如果已有汇编程序s3.asm其命令行可写为
tcc ic:/tc/include -lc:/tc/lib -mm s1 s2 s3.asm mylib.lib

表示用中模式(-mm)编译源文件s1.c和s2.c,调用TASM对s3.asm进行编译,然后连接生成可执行文件s1.exe,编译时,到c:/tc/include目录中去找包含文件,到

c:/tc/lib目录中去找库文件mylib.lib.

---------------------------------------

http://topic.youkuaiyun.com/t/20010308/22/81569.html

http://www.down22.org/plus/view.php?aid=15882



比VC难用。。。





本文转自

http://zhidao.baidu.com/question/27601788.html?fr=qrl
<think> 我们正在讨论DSP中C文件编译链接到OBJ文件时的内存计算方法。根据引用内容,DSP的C语言需要绝对定位,这与主机C语言由操作系统定位不同(引用[2]第3点)。此外,DSP的代码效率较高,适合嵌入式系统(引用[2]第4点)。 在DSP开发中,内存计算主要涉及以下几个方面: 1. **代码段(.text)**:存放编译后的机器指令。 2. **数据段**:包括初始化数据(.data)、未初始化数据(.bss)常量数据(.const)等。 计算方法: - 编译器将每个C文件编译成目标文件.obj),每个目标文件包含多个段(sections)。 - 链接器根据链接器命令文件.cmd)将这些段分配到具体的内存地址空间。 - 内存使用量等于所有段的大小之。 具体步骤: 1. 编译阶段:编译器为每个源文件生成目标文件,并生成一个初始的段大小信息(通常可以在map文件中查看)。 2. 链接阶段:链接器将各个目标文件的同名段合并,并根据.cmd文件进行地址分配。最终生成一个.map文件,其中详细列出了每个段的大小地址。 例如,在TI的CCS开发环境中,链接后会生成.map文件,其中包含如下信息: ``` SECTION ALLOCATION MAP output attributes/ section page origin length input sections -------- ---- ---------- ---------- ---------------- .text 0 00000000 00000020 00000000 00000020 file1.obj (.text) 00000000 00000020 file2.obj (.text) .data 0 00000020 00000010 00000000 00000010 file1.obj (.data) 00000000 00000010 file2.obj (.data) .bss 0 00000030 00000008 00000000 00000008 file1.obj (.bss) 00000000 00000008 file2.obj (.bss) ``` 在.map文件中,每个输出段(如.text, .data, .bss)的length就是该段占用的内存大小。将所有输出段的长度相加,即可得到整个程序占用的内存大小。 注意:实际内存占用还包括堆栈(stack)堆(heap)的空间,这些在链接时也会被分配。 **总结步骤**: 1. 编写程序并编译生成目标文件.obj)。 2. 编写链接器命令文件.cmd),定义内存布局(MEMORY)段分配(SECTIONS)。 3. 链接生成可执行文件,同时生成.map文件。 4. 查看.map文件中的“length”字段,即可知道每个段的大小总大小。 例如,总内存大小 = .text段长度 + .data段长度 + .bss段长度 + 堆栈大小(在.cmd中指定)。 引用[3]提到DMA控制器可以直接在内存外设之间传输数据,无需CPU参与,但这与编译链接时的内存计算无直接关联。 因此,DSP中内存计算的核心在于链接器生成的.map文件,其中详细列出了各段的大小位置。 </think> 在DSP开发中,`.c`文件编译链接生成`.obj`文件时的内存计算涉及以下关键方法,主要基于DSP的绝对定位特性(引用[2]第3点)链接器控制机制: ### 一、内存计算方法 1. **段(Section)划分** 编译器将`.c`文件中的代码数据分为不同段: - `.text`:存放可执行代码 - `.data`:初始化全局/静态变量 - `.bss`:未初始化全局/静态变量(不占obj文件空间) - `.const`:常量数据 ```c int global_var = 10; // 存入.data段(占4字节) const int const_var = 20; // 存入.const段(占4字节) void func() { /* 代码存入.text段 */ } ``` 2. **目标文件.obj)内存计算** 通过编译生成`.obj`时: - 使用编译器选项(如TI CCS的`--mem_model:data=far`)指定内存模型 - 运行`size`工具查看段大小: ``` section size (bytes) .text 0x120 .data 0x40 .bss 0x60 // 仅记录大小,实际不占obj空间 ``` 3. **链接器控制文件.cmd)** 定义内存布局(引用[2]第3点): ```cmd MEMORY { RAM : origin = 0x00800000, length = 0x10000 /* 64KB RAM */ FLASH : origin = 0x00000000, length = 0x40000 /* 256KB Flash */ } SECTIONS { .text > FLASH /* 代码段定位到Flash */ .data > RAM /* 初始化数据定位到RAM */ .bss > RAM /* 未初始化数据定位到RAM */ } ``` 4. **最终内存占用计算** 链接后通过`.map`文件获取实际占用: - **RAM总量** = `.data` + `.bss` + 堆栈空间 - **Flash总量** = `.text` + `.const` + 初始化数据副本 ### 二、关键影响因素 1. **数据定位模式** - 近地址(`near`):默认访问片内RAM(速度快) - 远地址(`far`):访问外部存储器(如引用[1]的扩展存储),需额外计算控制信号延迟 ```c #pragma DATA_SECTION(buffer, ".far_buffer") // 强制分配到远地址 char buffer[1024]; ``` 2. **优化技术** - 使用`const`将数据存入Flash节省RAM - 内存对齐(如`#pragma DATA_ALIGN`)可能增加填充字节 3. **启动代码开销** 初始化代码(`c_int00`)会占用额外ROM/RAM,需包含在计算中 ### 三、验证工具 1. **MAP文件分析** 链接生成的`.map`文件包含所有段地址、长度及填充信息: ``` .text 0x00000000 0x200 // 512字节 .data 0x00800000 0x80 // 128字节 .stack 0x00800100 0x100 // 256字节栈空间 ``` 2. **动态分析** 通过JTAG读取DSP内存地址(如引用[3]的DMA控制区域),验证实际分配 > 总结:DSP内存计算需结合编译段统计、链接器定位规则.map文件分析,重点注意绝对定位特性(引用[2])与物理存储控制(引用[1])的协同[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值