RNote103---R中的变量名操作

本文介绍了R语言中处理变量名的各种方法,包括检查变量名是否存在、获取变量值及通过字符串赋值创建新变量等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: “R中的变量名操作”
author: “刘栋”
date: “2018年7月12日”
output: word_document

knitr::opts_chunk$set(echo = TRUE)

  目的明确:循环赋值时,希望取出的字符串直接作为变量名。

exists

  查看当前工作空间是否存在该对象。

# 1.注意输入的是字符串
# 2,返回 FALSE
exists("test")
# 返回TRUE
test <- 1:10
test_name <- "test"
exists(test_name)

get0&get

  直接获取变量名为x的值(x=string,要求是字符串),如果不存在get0返回NULLget返回Error

# 返回 1  2  3  4  5  6  7  8  9 10
get0("test")
# 返回 1  2  3  4  5  6  7  8  9 10
get("test")
# 返回 NULL
get0("tes")
# 返回 Error in get("tes") : object 'tes' not found
get("tes")

assign

  assign(x, value),x为字符串,value为具体变量值,执行代码,即可生成x变量。

# 返回 FALSE,即当前工作空间内没有tes变量
exists("tes")
# 返回 生成tes变量
assign("tes",c("a","b","c"))
# 获取变量名为"tes"的变量
get0("tes")

                       2018-07-12 于南京市建邺区新城科技园

<think>我们使用readelf -a来查看一个交叉编译为ARM硬浮点架构的二进制文件test。readelf是一个用于显示ELF文件信息的工具,-a选项表示显示所有信息。下面我们将解释readelf -a输出的关键部分,并特别关注与ARM硬浮点相关的信息。 注意:由于输出内容非常长,我们不会展示全部输出,而是解释重要部分。 步骤: 1. 首先,使用交叉编译工具链编译一个C程序为ARM硬浮点架构的可执行文件(如test)。 2. 然后,使用交叉编译工具链中的readelf(即arm-linux-gnueabihf-readelf)来查看该文件,以确保正确解析ARM架构的ELF文件。 命令示例: arm-linux-gnueabihf-readelf -a test 输出内容主要包含以下部分: 1. ELF文件头(ELF Header) 2. 节头(Section Headers) 3. 程序头(Program Headers) 4. 动态节(Dynamic Section) 5. 重定位节(Relocation section) 6. 符号表(Symbol table) 7. 版本信息(Version information) 8. ARM特性部分(ARM-specific attributes)等 下面我们重点解释与ARM架构和硬浮点相关的部分: 一、ELF文件头(ELF Header) 在ELF文件头中,我们可以获取以下关键信息: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0x8309 Start of program headers: 52 (bytes into file) Start of section headers: 15080 (bytes into file) Flags: 0x5000400, Version5 EABI, hard-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 30 Section header string table index: 29 其中,我们关注: - Machine: 表明该文件是ARM架构。 - Flags: 这里的标志位0x5000400,其中0x5000000表示使用EABI第五版,0x400表示使用硬浮点(hard-float)ABI[^2]。 二、节头(Section Headers) 这部分列出了所有节(section)的信息,包括名称、类型、地址、偏移、大小等。例如: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 00008154 000154 000019 00 A 0 0 1 ... (省略) ... [14] .text PROGBITS 00008310 000310 0004a0 00 AX 0 0 4 ... (省略) ... 三、程序头(Program Headers) 程序头描述了程序如何被加载到内存中。例如: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x000c78 0x0000cc78 0x0000cc78 0x00008 0x00008 R 0x4 ... (省略) ... 四、动态节(Dynamic Section) 如果程序是动态链接的,这里会显示动态链接相关的信息,如需要的共享库等。 五、重定位节(Relocation section) 这部分显示了需要重定位的条目。 六、符号表(Symbol table) 这里列出了程序中的符号,包括函数名、变量名等。 七、ARM特性部分(ARM-specific attributes) 这是ARM架构特有的部分,用于描述ABI相关的属性。我们可以通过`readelf -A`(或`readelf --arch-specific`)来专门查看这部分。例如: Attribute Section: aeabi File Attributes Tag_CPU_name: "7-A" Tag_CPU_arch: v7 Tag_CPU_arch_profile: Application Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-2 Tag_FP_arch: VFPv3-D16 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: int Tag_ABI_VFP_args: VFP registers Tag_CPU_unaligned_access: v6 Tag_DIV_use: Not allowed 其中,我们关注: - Tag_CPU_name: 表示CPU类型。 - Tag_CPU_arch: 架构版本(如v7)。 - Tag_FP_arch: 浮点架构(如VFPv3-D16),表示使用VFP硬件浮点单元。 - Tag_ABI_VFP_args: 值为"VFP registers",表明使用VFP寄存器传递浮点参数,这是硬浮点(hard-float)的关键标志[^2]。 总结: 通过readelf -a,我们可以全面了解ELF文件的结构和属性。对于ARM硬浮点,关键点在于: - ELF文件头中的Flags标志(包含hard-float ABI标识)。 - ARM特性部分(通过readelf -A查看)中的Tag_ABI_VFP_args属性为"VFP registers",这明确指示了使用硬浮点调用约定。 因此,在交叉编译后,我们可以通过这些方法验证生成的二进制文件是否符合ARM硬浮点规范。 注意:如果使用非硬浮点的交叉编译器(如arm-linux-gnueabi),则不会出现硬浮点相关的标志。 示例:使用readelf -A查看硬浮点属性 arm-linux-gnueabihf-readelf -A test 输出中若包含: Tag_ABI_VFP_args: VFP registers 则确认是硬浮点ABI。 参考文献: [^1]: 使用基准测试工具可以评估性能差异。 [^2]: 通过readelf查看ELF文件头中的Flags和ARM特性部分,可以确认硬浮点ABI。 [^3]: 交叉编译时指定正确的工具链(arm-linux-gnueabihf-gcc)是生成硬浮点二进制文件的关键。 §§相关问题§§ 1. 如何通过readelf判断一个ARM二进制文件是使用软浮点还是硬浮点? 2. 在ARM架构中,VFP和NEON指令集有什么区别? 3. 交叉编译时如何指定使用ARMv7-A架构和硬浮点? 4. 如何解析readelf输出的重定位信息?</think>### 使用`readelf -a`分析ARM硬浮点架构二进制文件 以下是使用`arm-linux-gnueabihf-readelf -a test`命令输出的关键部分解释(基于ARM硬浮点架构): --- #### 1. **ELF文件头(ELF Header)** ```plaintext ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0x8300 Start of program headers: 52 (bytes into file) Start of section headers: 15080 (bytes into file) Flags: 0x5000400, Version5 EABI, hard-float ABI [★] Size of this header: 52 (bytes) ... ``` **关键字段解释:** - `Machine: ARM`:确认目标架构为ARM - `Flags: 0x5000400`:包含ABI类型标识 - **`hard-float ABI`**:明确指示使用硬浮点调用约定[^2] - `Entry point address`:程序入口地址(ARM指令起始位置) --- #### 2. **节头表(Section Headers)** ```plaintext Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 00008154 000154 000019 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 00008170 000170 000020 00 A 0 0 4 [ 3] .gnu.hash GNU_HASH 00008190 000190 000024 04 A 4 0 4 [ 4] .dynsym DYNSYM 000081b4 0001b4 000050 10 A 5 1 4 [ 5] .dynstr STRTAB 00008204 000204 00004c 00 A 0 0 1 [ 6] .gnu.version VERSYM 00008250 000250 00000a 02 A 4 0 2 [ 7] .gnu.version_r VERNEED 0000825c 00025c 000020 00 A 5 1 4 [ 8] .rel.dyn REL 0000827c 00027c 000008 08 A 4 0 4 [ 9] .init PROGBITS 00008284 000284 00000c 00 AX 0 0 4 [10] .text PROGBITS 00008290 000290 0001a0 00 AX 0 0 4 [★] [11] .fini PROGBITS 00008430 000430 000008 00 AX 0 0 4 ... ``` **关键节解释:** - `.interp`:程序解释器路径(如`/lib/ld-linux-armhf.so.3`) - `.text`:**代码段**,包含所有ARM指令(含浮点操作码) - `.rodata`:只读数据段(如字符串常量) - `.data`:已初始化全局变量 - `.bss`:未初始化全局变量 --- #### 3. **程序头表(Program Headers)** ```plaintext Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x000c78 0x0000cc78 0x0000cc78 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00120 0x00120 R E 0x4 INTERP 0x000154 0x00008154 0x00008154 0x00019 0x00019 R 0x1 [Requesting program interpreter: /lib/ld-linux-armhf.so.3] [★] LOAD 0x000000 0x00008000 0x00008000 0x00474 0x00474 R E 0x8000 LOAD 0x000f0c 0x00010f0c 0x00010f0c 0x00120 0x00128 RW 0x8000 DYNAMIC 0x000f18 0x00010f18 0x00010f18 0x000e8 0x000e8 RW 0x4 ... ``` **关键段解释:** - `INTERP`:指定动态链接器`ld-linux-armhf.so.3`(`hf`表示硬浮点) - `LOAD`:可加载段(代码段权限为R E,数据段为RW) - `DYNAMIC`:动态链接信息表 --- #### 4. **动态段(Dynamic Section)** ```plaintext Dynamic section at offset 0xf18 contains 24 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x0000000c (INIT) 0x8284 0x0000000d (FINI) 0x8430 0x00000019 (INIT_ARRAY) 0x10f0c 0x0000001b (INIT_ARRAYSZ) 4 (bytes) 0x00000004 (HASH) 0x8190 0x00000005 (STRTAB) 0x8204 ... ``` **关键信息:** - `NEEDED`:依赖的共享库(如libc的硬浮点版本) - `INIT/FINI`:初始化/终止函数地址 --- #### 5. **ARM特性属性(ARM-specific features)** ```plaintext Attribute Section: aeabi File Attributes: Tag_CPU_name: "Cortex-A9" Tag_CPU_arch: v7 Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-2 Tag_FP_arch: VFPv3 [★] Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_VFP_args: VFP registers [★] Tag_CPU_unaligned_access: v6 ``` **硬浮点关键证据:** - `Tag_FP_arch: VFPv3`:使用VFPv3浮点单元 - `Tag_ABI_VFP_args: VFP registers`:**确认硬浮点调用约定**(浮点参数通过VFP寄存器传递)[^2] - `Tag_ABI_FP_number_model: IEEE 754`:遵循IEEE浮点标准 --- ### 验证总结 通过`readelf -a`可确认: 1. 文件为**ARMv7架构**(Cortex-A9) 2. 使用**硬浮点ABI**(VFP寄存器传参) 3. 依赖**硬浮点动态链接器**(`ld-linux-armhf.so.3`) 4. 包含**VFPv3浮点指令集** 5. 遵循**IEEE 754浮点标准** > 注:完整输出约200+行,以上仅展示关键片段。实际分析时需结合交叉编译器版本和目标平台特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值