: find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy -8" "objcopy") find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy
网上可以找到相关的工具(搜索 bin2c 或 bin2h),比如这个embed-resource 第二种方式就是用GNU的objcopy工具来实现。 objcopy本身就提供了二进制数据转成obj文件的能力 执行如下指令即可将 file.bin 生成 elf32-i386 格式的obj文件 file.o objcopy -I binary -O elf32 NDK 的objcopy生成 elf32-littlearm格式的obj :: 将ndk objcopy位置添加到搜索路径 $ SET PATH=${android-ndk-r19c}/toolchains 如果你已经安装了MinGW编译器,使用MinGW提供的objcopy或ld就可以生成MS COFF格式的obj文件了 如下生成MSVC所需的PE格式obj文件 objcopy -I binary -O 》 《llvm-objcopy - object copying and editing tool》
= copy(obj) console.log(objCopy) // { name: "bird", abilities: ["fly","sing"]} objCopy.name = "bird01 " // 修改原始类型的属性 console.log(objCopy) // {name: 'bird01', abilities: ["fly","sing"]} objCopy.abilities.push ("lay eggs") // 修改引用类型的属性 console.log(objCopy) // {name: 'bird01', abilities: ["fly","sing", 'lay eggs ") console.log(obj) // { name: "bird", abilities: ["fly","sing","lay egg"]} const objCopy2 = {...obj } // { name: "bird", abilities: ["fly","sing","lay egg"]} objCopy2.abilities.pop() console.log(obj)
我们给出一个对象: var obj = { "a": 1, "b": 2 }; 同样做测试: var objCopy = obj; objCopy.b = 3; obj // => { "a": 1 , "b": 3 } objCopy // => { "a": 1, "b": 3 } 同样,简单的赋值运算只是创建了一份浅拷贝。 objDeepCopy(source[item]) : source[item]; return sourceCopy; } var objCopy = objDeepCopy(obj); objCopy.a.a1 [1] = "a13"; obj // => { "a": { "a1": ["a11", "a12"], "a2": 1 }, "b": 2 } objCopy // => { "a": { ); objCopy[0].a.a1[1] = "a13"; objCopy[1][1].e = "6"; obj // => [{ "a": { "a1": ["a11", "a12"], "a2
: any = {...obj}; console.log(objCopy); // { x: 1, y: 'name', z: 2 } console.log(objCopy === obj ); // false // copy and change var obj2 = {a: "age"}; objCopy = {...obj, z: "zoo"}; console.log(objCopy ); // { x: 1, y: 'name', z: 'zoo' } // merge var obj2 = {a: "age"}; objCopy = {...obj, ...obj2 }; console.log(objCopy); // { x: 1, y: 'name', z: 2, a: 'age' } // copy and remove let {z, ... objCopy2} = obj console.log(objCopy2); // { x: 1, y: 'name' }
: any = {...obj}; console.log(objCopy); // { x: 1, y: 'name', z: 2 } console.log(objCopy === obj ); // false // copy and change var obj2 = {a: "age"}; objCopy = {...obj, z: "zoo"}; console.log(objCopy ); // { x: 1, y: 'name', z: 'zoo' } // merge var obj2 = {a: "age"}; objCopy = {...obj, ...obj2 }; console.log(objCopy); // { x: 1, y: 'name', z: 2, a: 'age' } // copy and remove let {z, ... objCopy2} = obj console.log(objCopy2); // { x: 1, y: 'name' }
getTime时间戳了console.log(objCopy.dateTime.getTime())所以在序列化日期对象的时候千千万万要注意。 循环引用的对象将会抛出错误const obj = {name:'小魔神',like:'喜欢和乌鸦说话',sex:null}obj.sex = obj; //我们这里循环引用了,将会报错const objCopy = JSON.parse(JSON.stringify(obj));console.log("objCopy", objCopy)undefined、函数、symbol值 在不同的场合将会发生不同的反应 = JSON.parse(JSON.stringify(obj));console.log("objCopy",objCopy)我们发现 undefined、函数、symbol值,在序列化过程中会被忽略 = JSON.parse(JSON.stringify(arr));console.log("objCopy",objCopy)所以在进行拷贝的时候,需要特别注意一下。
通过 objcopy 把某文件内容新增为一个 Section 上面介绍了 C 和汇编层面的方法,再来介绍一个工具层面的方法。 objcopy 这个工具很强大,其中就包括新增 Section。 不能直接在最终的可执行文件和共享库中加入一个 Section: $ objcopy --add-section .interp=interp.section.txt --set-section-flags .interp=alloc,readonly libhello.so objcopy:stTyWnxc: can't add section '.interp': File in wrong format 通过 objcopy 更新某个 Section 以上三种新增 Section 的方式适合不同的需求:汇编语言、C 语言、链接阶段,基本能满足日常的开发需要。 其实不需要重新编译,因为可以直接这样换掉: $ objcopy --dump-section .interp=interp.txt libhello.so $ sed -i -e "s%/lib/i386
objcopy修改符号表 生成库之后,可使用工具链中的 objcopy 工具,修改符号表,将内部函数都修改为本地函数,这样外部代码无法直接链接到这些函数,只能使用指定的函数。 查看帮助可知,objcopy 支持将除 -G 参数指定的符号外,其他符号全部修改成本地符号。 mylib_origin.o objcopy -G api_1 -G api_2 mylib_origin.o mylib.o strip删减符号表 生成库之后,可使用工具链中的 strip 工具 的效果 不修改源文件,直接使用objcopy修改mylib.o mv mylib.o mylib_origin.o objcopy -G api_1 -G api_2 mylib_origin.o 结语 本文主要介绍了,static标记函数,objcopy和strip三种方式,避免库内部函数被外部程序使用。但即使strip删除了符号表,也还是可以从二进制文件中分析到内外部函数名称的。
'Hello'; let copy = str; copy = 'Hi'; // str = 'Hello', copy = 'Hi' let obj = { a: 1, b: 2 }; let objCopy = obj; objCopy.b = 4; // obj = { a: 1, b: 4}, objCopy = { a: 1, b: 4 } 在 obj 中发生的事是该对象是通过引用传递给 objCopy objCopy 实际上是引用同一对象的别名。
qemu-riscv64_smode_defconfig CC="riscv64-linux-musl-gcc" make -j $(nproc) CC="riscv64-linux-musl-gcc" OBJCOPY =riscv64-linux-musl-objcopy STRIP=riscv64-linux-musl-strip RANLIB=riscv64-linux-musl-ranlib NM=riscv64 with-platform=efi BUILD_CC=gcc HOST_CC=x86_64-linux-gnu-gcc TARGET_CC=riscv64-linux-musl-gcc TARGET_OBJCOPY =riscv64-linux-musl-objcopy TARGET_STRIP=riscv64-linux-musl-strip TARGET_RANLIB=riscv64-linux-musl-ranlib
4.2 gcc 不行,试试 objcopy 格式转换 既然现在的 gcc 默认不支持生成 a.out 格式,那尝试用 objcopy 转换看看,发现也不成功。 $ objcopy -O a.out-i386-linux a.out a.out-elf objcopy: a.out-elf: can not represent section `.interp' $ cd (linux-lab)/examples/assembly/x86 $ make $ objcopy -O a.out-i386-linux x86-hello x86-hello-a.out 试着从 QMAGIC a.out 转换为 ELF,竟然可以运行成功: $ objcopy -O elf32-i386 a.out elf-hello $ file . 补充一下,用 objcopy --info 可以列出支持的所有格式: $ objcopy --info a.out-i386-linux pei-i386 pei-x86-64 elf64
工具可以将elf文件转化为适合于单片机的bin文件和hex文件,其中参数-O(大写o)用于指定输出文件的格式(默认是bin格式) arm-none-eabi-objcopy test.elf test.bin arm-none-eabi-objcopy test.elf -Oihex test.hex 7.编写一个makefile雏形 TARGET=test CC=arm-none-eabi-gcc OBJCOPY =arm-none-eabi-objcopy RM=rm -f CORE=3 CPUFLAGS=-mthumb -mcpu=cortex-m$(CORE) LDFLAGS = -T stm32_flash.ld ) -c $^ $(CPUFLAGS) $(CFLAGS) $@ main.o:main.c $(CC) -c $^ $(CPUFLAGS) $(CFLAGS) $@ bin: $(OBJCOPY ) $(TARGET).elf $(TARGET).bin hex: $(OBJCOPY) $(TARGET).elf -Oihex $(TARGET).hex clean: $(RM)
arm-none-eabi-objcopy -O binary build/main.elf build/main.bin arm-none-eabi-objcopy -O ihex build/main.elf # 设置编译器、汇编器、链接器等工具 CC = arm-none-eabi-gcc AS = arm-none-eabi-as LD = arm-none-eabi-ld OBJCOPY = arm-none-eabi-objcopy 3.2.5 生成二进制文件和 HEX 文件 $(BIN): $(OUTPUT) $(OBJCOPY) $(OBJCPYFLAGS) $< $@ $(BIN):二进制文件。 $(HEX): $(OUTPUT) $(OBJCOPY) $(OBJCOPYHEXFLAGS) $< $@ $(HEX):HEX 文件。 自动化操作:通过 Makefile 的规则,运行 $(OBJCOPY) 自动生成二进制文件和 HEX 文件,准备烧录。
stm32f103vet6.ld -o helloworld.out uart_helloworld.o isr.o helloworld.bin: helloworld.out arm-elf-objcopy BINARY= main PREFIX = arm-elf CC = $(PREFIX)-gcc LD = $(PREFIX)-ld OBJCOPY = $(PREFIX)-objcopy OBJDUMP (LDSCRIPT)(CC) (CFLAGS) -o start.o -c start.s(LD) -o (*).elf start.o (OBJS) (LDFLAGS) %.bin: %.elf(OBJCOPY ) -Obinary (*).elf (*).bin %.hex:%.elf(OBJCOPY) -Oihex (*).elf (*).hex %.srec: %.elf(OBJCOPY) -Osrec @(OBJCOPY) -O ihex @ (TARGET).hex@echo Generating asm...@(OBJDUMP) -D -S @ > (TARGET).asm@echo OK!
nostartfiles -o isr.o arm-elf-ld -T stm32f103vet6.ld -o helloworld.out uart_helloworld.o isr.o arm-elf-objcopy stm32f103vet6.ld -o helloworld.out uart_helloworld.o isr.o helloworld.bin: helloworld.out arm-elf-objcopy (LDSCRIPT)(CC) (CFLAGS) -o start.o -c start.s(LD) -o (*).elf start.o (OBJS) (LDFLAGS) %.bin: %.elf(OBJCOPY ) -Obinary (*).elf (*).bin %.hex:%.elf(OBJCOPY) -Oihex (*).elf (*).hex %.srec: %.elf(OBJCOPY) -Osrec
编译工具 1.编辑工具介绍 GNU提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、连接器ld和二进制转换工具objcopy。 基于ARM平台的工具分别为 arm-linux-as、arm-linux-gcc、arm-linux-g++、arm-linux-ld和arm-linux- objcopy。 (5)生成二进制代码 连接生成的elf文件还不能直接下载执行,通过objcopy工具可生成最终的二进制文件: arm-linux-objcopy –O binary bootstrap.elf bootstrap.bin Objcopy还可以生成S格式的文件,只需将参数换成-O srec。还可以使用-S选项,移除所有的符号信息及重定位信息。 用GNU工具开发基于ARM的嵌入式系统,http://blog.163.com/liren0@126/blog/static/32897598200821211144696/ 7. objcopy命令介绍
ceph-osd 关键的strip的用法 gcc编译的时候带上-g参数,就是添加了debug的信息 gcc -g -o 分离debug information [root@host1 ceph-10.2.6]#objcopy root root 235M Mar 23 18:10 src/ceph-osd.debug 从原始文件去掉 debug information [root@host1 ceph-10.2.6]# objcopy ceph-osd[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl-rwxr-xr-x 1 root root 18M Mar 23 18:11 src/ceph-osd objcopy ceph-osd -hl-rwxr-xr-x 1 root root 14M Mar 23 18:12 src/ceph-osd 启用debuglink模式 [root@host1 ceph-10.2.6]# objcopy
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin: arm-linux-gnueabihf-objcopy:使用arm-linux-gnueabihf 工具链中的objcopy工具。 g -c led.s -o led.o arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin:将led.elf文件转换为二进制文件led.bin,这里使用了arm-linux-gnueabihf 工具链中的objcopy工具,并且指定了输出的文件格式为二进制。
当改为 Command '['aarch64-xilinx-linux-objcopy', '--only-keep-debug', '/proj/hankf/vck190/v212/dapd-0211 Subprocess output:aarch64-xilinx-linux-objcopy: Unable to recognise the format of the input file `/proj