㈠ 在linux系统中怎么使C程序变成Intel的汇编程序而不是AT&T的,gcc编译后默认的是AT&T的
gcc编译的程序码是没有“Intel”、“at&t”之分的⋯⋯就是二进制而已。所谓的“Intel”、“at&t”是指汇编语言的写作格式。
如果你用yum软件包管理器,sudo yum install nasm。
如果你用apt-get,sudo apt-get install nasm。
如果不行,就到sourceforge下载nasm的rpm(如果是yum)或deb(apt-get),然后安装。
如果还不行,下载源码,然后终端里(在解压出的目录下):
./configure
make
sudo make install
最后,ndisasm -b 32 文件名。
顺便一说安装的这个nasm是intel格式的汇编编译器。相当好。然后ndisasm是它附带的反汇编器。
不好意思没法放网址。网络会把这个回答给删掉。
star特530的是ARM汇编的。
㈡ 请问arm-linux-gcc和arm-linux-ld还有arm-linux-obj之间是什么关系
arm-linux-ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。
arm-linux-gcc -wall -O2 -c -o $@ $<
-o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-Wall 指定产生全部的警告信息
-O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高
-c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由 .c 或 .cc 变成 .o 的目标文件
-S 只激活预处理和编译,就是指把文件编译成为汇编代码
arm-linux-ld 直接指定代码段,数据段,BSS段的起始地址
-Tbss ADDRESS Set address of .bss section
-Tdata ADDRESS Set address of .data section
-Ttext ADDRESS Set address of .text section
示例:
${CROSS}ld -Ttext=0x33000000 led.o -o led.elf
使用连接脚本设置地址:
arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf
其中beep.lds 为连接脚本如下:
arm-linux-obj被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换
示例:
arm-linux-obj –o binary –S elf_file bin_file
常用的选项:
input-file , outflie
输入和输出文件,如果没有outfile,则输出文件名为输入文件名
2.-l bfdname或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-obj自己分析
3.-O bfdname 输出的格式
4.-F bfdname 同时指明源文件,目的文件的格式
5.-R sectionname 从输出文件中删除掉所有名为sectionname的段
6.-S 不从源文件中复制重定位信息和符号信息到目标文件中
7.-g 不从源文件中复制调试符号到目标文件中
arm-linux-objmp
查看目标文件(.o文件)和库文件(.a文件)信息
arm-linux-objmp -D -m arm beep.elf > beep.dis
-D 显示文件中所有汇编信息
-m machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.
[guowenxue@localhost asm_c_buzzer]$ cat beep.lds
/***********************************************************************
* File: beep.lds
* Version: 1.0.0
* Copyright: 2011 (c) Guo Wenxue <[email protected]>
* Description: Cross tool link text, refer to u-boot.lds
* ChangeLog: 1, Release initial version on "Mon Mar 21 21:09:52 CST 2011"
*
**********************************************************************/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS{
. = 0x33000000;
.text : {
*(.text)
*(.rodata)
}
.data ALIGN(4): {
*(.data)
}
.bss ALIGN(4): {
*(.bss)
}
}
[guowenxue@localhost asm_c_buzzer]$ cat makefile
# ***********************************************************************
# * File: makefile
# * Version: 1.0.0
# * Copyright: 2011 (c) Guo Wenxue <[email protected]>
# * Description: Makefile used to cross compile the ASM and C source code
# * ChangeLog: 1, Release initial version on "Mon Mar 21 21:09:52 CST 2011"
# *
# ***********************************************************************
CROSS = /opt/buildroot-2011.02/arm920t/usr/bin/arm-linux-
CFLAGS =
beep.bin: start.S beep.c
arm-linux-gcc $(CFLAGS) -c -o start.o start.S
arm-linux-gcc $(CFLAGS) -c -o beep.o beep.c
arm-linux-ld -Tbeep.lds start.o beep.o -o beep.elf
arm-linux-obj -O binary -S beep.elf beep.bin
rm -f *.elf *.o
install:
cp beep.bin ~/winxp -f --reply=yes
clean:
rm -f *.elf *.o
rm -f beep.bin
㈢ 求6502和ARM的反汇编软件
Linux下似乎可以用gdb反汇编arm的程序,找一下arm-linux的toolchain
Windows下只能用ADS了,就是ARM官方出的一个开发套件。这个东西一般买开发板的时候都带的。
㈣ Linux为什么开源
使用Linux必须手动输入命令是一个偏见。本人长年累月地使用Linux,但是我并不熟悉Linux的命令。
Linux一般都部署在服务器上,为了让服务器更稳定,在服务器上安装Linux时常常不安装图形环境。这也是让人产生“做什么事情都需要手动输入命令”的错觉。
实际上,我对开源的概念也不是十分理解。简单地说,允许查看、修改源代码的软件就属于开源软件。而像Win和MacOsX这样的系统,源代码都是保密的,他们都是闭源软件。
按照开源许可协议,所有的Linux发行版都必须公开源代码。不过因为源代码很占用空间,源代码一般不会直接附在发行版的光盘中,需要您自己下载。
DOS系统是由汇编语言编写的,其余的能叫上名字的操作系统,比如Linux、DBS、Win之类的,一般都是由C语言编写的。
因为Win是闭源软件,因此您看不到它的源代码,修改起来也比较难。要想修改Win,首先您要熟悉软件的反汇编技术,其次您要做好保密工作,不要让人发现,被发现了是要坐牢的。
顺便说一句:WinCE是开源的。
修改Linux的源代码就比较自由了。
不知到您的编程水平如何,我稍微提醒您一下,自2.6.27开始,Linux内核的代码就超过1000万行了,虽然大部分的代码都是些驱动程序。
在阅读源代码前,最好先找本介绍Linux内核原理的书。
㈤ 分析linux内核崩溃信息
分析kernel比较关键的就是看三点:
1) 内核会给出一个崩溃原因的猜测,这里是,CPU 0 Unable to handle kernel paging request at virtual address 00000000
2) 看pc指针的值,这里是epc == 00000000
3) 看调用栈Call Trace:[ //可惜后面没给出来
通常是根据指针加上偏移值跟反汇编代码对照,找到出问题的指令。
这个panic的原因比较明显,应该是引用了空指针,试图执行0x00000000出的代码。