我在使用objcopy命令时遇到如下问题:我用友善之臂的4.3.2交叉编译器的arm-linux-objcopy -O binary -S vmlinux zImage来生成内核的bin文件时,生成的bin文件zImage却有3228296352(3228M多)个字节,而vmlinux本身只有8293829(8M多)。不知道这是怎么回事。我在MIPS的平台下测试objcopy生成的bin文件发现bin文件比vmlinux的elf格式文件小,证明友善之臂的4.3.2的交叉编译器中objcopy生成的bin文件不对,不知道是不是交叉编译器的问题。还请各位帮忙分析一下,有没有碰到这种问题。谢谢!
root@ubuntu:/samba_share/kernel/linux-2.6.29.1-20100702-ramfs# ls -l vmlinux
-rwxr-xr-x 1 root root 8293829 2010-07-24 19:55 vmlinux
root@ubuntu:/samba_share/kernel/linux-2.6.29.1-20100702-ramfs# arm-linux-objcopy -O binary -S vmlinux zImage
root@ubuntu:/samba_share/kernel/linux-2.6.29.1-20100702-ramfs# ls -l zImage
-rw-r--r-- 1 root root 3228296352 2010-07-29 08:57 zImage
root@ubuntu:/samba_share/kernel/linux-2.6.29.1-20100702-ramfs# file vmlinux
vmlinux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
root@ubuntu:/samba_share/kernel/linux-2.6.29.1-20100702-ramfs# file zImage
zImage: X11 SNF font data, LSB first
root@ubuntu:/samba_share/kernel/linux-2.6.29.1-20100702-ramfs# 刚开始还以为是交叉编译器的问题,使用别的版本的交叉编译器来做实验,发现结果还是生成一个很大的zImage文件。结果google了以下,在帖子 “linux zImage生成过程详解”中看到了Makefile中生成zImage的部分,突然明白了是objcopy命令的参数问题。objcopy命令没使用对,参考了内核源码下Makefile中的生成zImage等脚本发现,arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux zImage命令能够去掉内核中的一些.note 等信息。 Objcopy命令的使用可以参考:~daniel/linux/objcopy.html objcopy copy and translate object files: 複製 .o 檔 (obj file) 的內部內容到另一個檔案中 (.o 檔或是單純地做 hex dump) 將一個 binary data (如JPEG 圖片) 做成 .o 檔 把執行碼從 ELF 中抽取出來 只抽取指定的 section 常用參數 objcopy [`-I' bfdname|`--input-target='bfdname] [`-O' bfdname|`--output-target='bfdname] [`-B' bfdarch|`--binary-architecture='bfdarch] [`-S'|`--strip-all'] [`-g'|`--strip-debug'] [`-j' sectionname|`--only-section='sectionname] [`-R' sectionname|`--remove-section='sectionname] [`--help'] infile [outfile] GNU binutil manual GNU objcopy manual GNU Binary Utilities 使用範例列出可用的 BFD target 2. $ objdump -i 3. 4. BFD header file version (GNU Binutils for Ubuntu) 2.18 5. elf32-i386 6. (header little endian, data little endian) 7. i386 8. a.out-i386-linux 9. (header little endian, data little endian) 10. i386 11. efi-app-ia32 12. (header little endian, data little endian) 13. i386 14. elf32-little 15. (header little endian, data little endian) 16. i386 17. elf32-big 18. (header big endian, data big endian) 19. i386 20. elf64-x86-64 21. (header little endian, data little endian) 22. i386 23. efi-app-x86_64 24. (header little endian, data little endian) 25. i386 26. elf64-little 27. (header little endian, data little endian) 28. i386 29. elf64-big 30. (header big endian, data big endian) 31. i386 32. srec 33. (header endianness unknown, data endianness unknown) 34. i386 35. symbolsrec 36. (header endianness unknown, data endianness unknown) 37. i386 38. tekhex 39. (header endianness unknown, data endianness unknown) 40. i386 41. binary 42. (header endianness unknown, data endianness unknown) 43. i386 44. ihex 45. (header endianness unknown, data endianness unknown) 46. i386 47. trad-core 48. (header endianness unknown, data endianness unknown) 49. 50. elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big 51. i386 elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big 52. 53. elf64-x86-64 efi-app-x86_64 elf64-little elf64-big srec 54. i386 elf64-x86-64 efi-app-x86_64 elf64-little elf64-big srec 55. 56. symbolsrec tekhex binary ihex trad-core 57. i386 symbolsrec tekhex binary ihex --------- 將一個 JPEG 圖片檔 做成 .o 檔 59. $ objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o 把執行碼從 ELF 中抽取出來,去除 symbol table, relocation information, .comment section, 和 .note section 61. $ objcopy -O binary -S -R .comment -R .note code.o code.bin 只抽取指定的 section 63. $ objcopy -O binary -j .text code.o code.bin
阅读(6208) | 评论(0) | 转发(0) |