如何将调用的lib里的函数放到指定地址

1.  在工程中添加所需的.lib文件,然后运行编译,生成.M51文件:

 

2. 打开.M51文件,找到使用函数的segment name:

 

3. 根据segment name,在KeilC 的BL51选项卡下按照自己的需求进行指定地址设置,指定地址指令如下:

 

 

设置完成后,rebulid工程,在新生成的.M51文件中确认是否按要求更改函数地址:

 

 

注意事项:

与直接分配main函数中的子函数到指定地址的操作不同处在于,BL51中的指令部分:

是:         ?PR?ADD1?CHAR(0X3900)

而不是:  ?PR?ADD1?MAIN(0X3900)

因为add1()函数是char.obj中的函数(char.obj是lib中的一个obj),不是main.obj中的函数!  

 

KEIL C将程序编译的过程如下:

1. 通过EDIT编写.c文件或汇编文件;

2. 经过compiler(C51或A51)将.c文件或汇编文件生成.obj文件。此时的.obj文件是relocatable;

3. 此时可以将.obj文件生成.lib文件,供以后的main函数.c文件调用;

第三步指的是1、2步中的.c文件不带main函数,即前两步中的文件是用来作lib程序的。如果前两步的.c文件是主函数,第三步可忽略。

4. 通过Linker工具(BL51),将第2步生成的.obj文件生成有固定地址的obj文件;

5. 通过编译器将第4步生成的obj module转换成需要的.hex文件或debuger文件或仿真文件。

 

BL51 Introduction

The BL51 Linker/Locator creates an absolute object module by linking together object modules created using the Keil A51 Assembler, C51 Compiler, Intel ASM-51 Assembler, and Intel PL/M-51 Compiler. Object modules created by these tools are relocatable and cannot be directly executed (even if they consist of only one source module). They must be linked and converted into an absolute object modules using the linker.

The following figure shows how C51 object modules flow through the Keil tool chain.

The object module generated by the BL51 Linker is an absolute object module. All relocatable sections are assigned and located at fixed addresses.

The object module includes information required for initializing global variables, zero-initializing global variables, program code and constants, as well as symbolic information, line number information, and other debugging details.

The object module may be used by the OH51 Object-HEX Converter to create an Intel HEX file for programming into ROM. It may be loaded directly into an emulator or the Keil µVision Simulator/Debugger for testing and debugging.

Note

  • By default, the object file generated by the linker has no file extension.

 

 

reference: http://www.keil.com/support/man/docs/bl51/bl51_intro.htm

                 http://www.keil.com/support/man/docs/bl51/bl51_ln_objfile.htm

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: libm.so.6是Linux系统中的一个动态链接库,它包含了一些浮点运算库函数。它通常被用于编译和链接数值计算相关的程序,比如科学计算、工程计算以及3D渲染等应用程序中。而/usr/lib64目录则是Linux系统中64位应用程序的默认安装目录之一,它包含了各种共享库文件,包括一些程序运行所依赖的动态链接库文件。 将libm.so.6放到/usr/lib64/_libm.so.6的做法,实际上是将这个动态链接库文件重命名为_libm.so.6,并将其移动到/usr/lib64目录下。这样做可以让Linux系统中的其他程序可以方便地调用这个库文件,实现数值计算等相关的功能。需要注意的是,操作系统和应用程序可能会依赖于不同版本的这个库文件,因此在使用时需要注意选择正确的库文件版本,并将其放置到正确的目录下。 ### 回答2: libm.so.6是一个数学库文件,通常用于数学计算,其中的“so”代表共享对象。将它放置在/usr/lib64/_libm.so.6的目录下,是将该库文件放置在系统的64位共享目录下。这意味着所有64位应用程序都可以轻松地访问该库文件。在这个位置放置库文件,可以使它更容易被其他应用程序使用。同时,这个位置还可以保证该库文件能够被系统开机自动载入,从而保证它始终可用。如果库文件被放在其他位置,可能会导致访问麻烦,让其他应用程序无法找到它,从而导致应用程序在使用时出现各种问题。总之,将libm.so.6放到/usr/lib64/_libm.so.6是一种比较合理的选择。 ### 回答3: libm.so.6 是数学库文件,通常用于处理数学计算相关的函数。将它放到 /usr/lib64/_libm.so.6 的操作则是将其放到系统的指定目录下。 在 Linux 系统中,libm.so.6 常常是由 C 库(libc)提供的,因为 C 标准库需要使用数学函数(如 sin、cos、sqrt 和 log 等)。如果你的应用程序需要使用这些函数,那么需要包含 libm.so.6,否则编译器报错。 将 libm.so.6 放到 /usr/lib64/_libm.so.6 的操作则是将其放到系统的指定目录下,这样其他的应用程序可以直接调用该库文件,无需再手动添加位置。 总之,将 libm.so.6 放到指定目录下是一种方便快捷的管理方式,可以提高程序的运行效率,也使得其运行更加稳定可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值