int i = 0; i = (++i)+(++i); printf("i=%d\n",i); 请问一下结果 i 为什么是4,而不是3,求解释??linux下的反汇编:
15movl$0, -4(%ebp)i = 0
16addl$1, -4(%ebp)++i
17addl$1, -4(%ebp)++i
18movl-4(%ebp), %eax\
19addl%eax, %eax|i = i + i
20movl%eax, -4(%ebp)/
-4(%ebp)表示的就是i 。执行的结果就如同其他人说的那样,最后i+i的时候i已经是2了 。
当初的++操作只是为了节省源代码的空间,实际项目中最好不要用 。
LINUX下有一般用什么反汇编工具答linux下反汇编命令:linux上很容易反汇编linux下反汇编命令的埃用nasm就可以的 。1、首先读取mbr sudo dd if=/dev/sda of=mbr.bin count=1 dd是linux的命令,需要root权限的,if是输入方法,在linux上所有的设备都是文件,mbr在第一块硬盘上 , 所以if=dev/sda 。of=mbr.bin
linux中 gcc 下ld 链接成什么格式的目标文件,有生成的哪些文件可以反汇编,反汇编的工具有哪些?elf可执行文件
生成的目标文件(也即.o文件)和elf文件都可以反汇编
反汇编工具就是objdump命令 , 加个-S的选项就可以了 。例如:
objdump -S hellohello.dump
怎样反汇编bzImage-platinum-ChinaUnix博客具体步骤如下:
#! /bin/sh
set -x
#
# 一般gzip压缩包的magic值为0x8b1f后跟0x0008,或者0x0808 。
# 这里就是要找出这个偏移 。
# 119116 , 就是这个偏移,这个偏移在不同的bzImage里是不同的,所以,这里需要手动调整一下 。
# 解压后的文件即vmlinux.bin
od -h -A d bzImage | grep --color -m 3 -A 1 -i 8b1f
dd if=bzImage bs=1 skip=11916 | gunzipvmlinux.bin
# 调用我写的一个python脚本,生成gnu linker script 。
./genlds.pyvmlinux.elf.lds
# 构造 ELF 信息 , 结果文件为vmlinux.elf
ld -m elf_x86_64 --format binary --oformat elf64-x86-64 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf
# 如果是32位系统 , 可以用以下命令
#ld -m elf_i386 --format binary --oformat elf32-i386 -T vmlinux.elf.lds vmlinux.bin -o vmlinux.elf
# 删除在上一步生成的多余符号 。
objcopy --strip-symbol _binary_vmlinux_bin_start --strip-symbol _binary_vmlinux_bin_end --strip-symbol _binary_vmlinux_bin_size vmlinux.elf
# 设置 .text section标志,否则objdump -d不能正常工作 , 只能用objdump -D 。
objcopy --set-section-flag .text=alloc,readonly,code vmlinux.elf
# 以后只是出于验证目的 。
# 以schedule函数作为一个样本,检查在vmlinux.elf文件里是不是包括了正确的偏移 。
grep --color "[tT] schedule$" System.map
readelf -s vmlinux.elf | grep" schedule$" --color
【linux下反汇编命令 反汇编语言指令大全】genlds.py内容如下:
#! /usr/bin/python
import sys
#将 形如 fffffff8989 的字符串转换为数字形式 。
def to_no(hexstr):
ret = 0
start = -1
len_hexstr = len(hexstr)
while start=-len_hexstr:
c = hexstr
if c in "0123456789":
n = ord(c) - ord('0')
elif c in "abcdef":
n = ord(c) - ord('a') + 0xa
elif c in "ABCDEF":
n = ord(c) - ord('A') + 0xa
ret |= long(n((-start-1)*4))
start -= 1
return ret
# 计算addr-base
def sym_offset(addr, base):
if base == "missing-base":
return "missing-offset"
addr = to_no(addr)
base = to_no(base)
return hex(int(addr-base))
lines = file("System.map").readlines()
result=""
# 求.text的开始地址
base="missing-base"
for line in lines:
line = line.strip()
addr, type, sym = line.split(" ")
if type in "tT":
if sym in ("startup_64", "startup_32"):
base = addr
break
# 生成lds中的符号行 。
推荐阅读
- 无限恐怖下载,无限恐怖下载全本精校版pdf
- 本溪sap系统服务,sap售后服务电话
- 多媒体电视投屏神器怎么用,多媒体电视投屏神器怎么用教程
- 王者荣耀凯爹抖音直播,王者荣耀凯爹是什么英雄
- c语言调用函数求平均分 c语言调用函数求平均成绩
- 战火下载,战火下载大全
- 手机为什么总弹出火山直播,火山直播弹幕怎么关闭
- java代码默认字体,java字体怎么设置
- 怪物猎人ios怎么锁定视角,怪物猎人锁定设置