bc (standard_in) 1: 语法错误
bc (standard_in) 1: syntax error
我试图在以下可执行文件中找到 myfunc
的位置:
#include <stdio.h>
void myfunc(){
printf("Hello");
}
int main(){
}
我写了这个脚本:
#!/bin/bash -x
start=$(nm -S a.out|grep -w _start)
start_addr=$(echo $start | awk '{print }')
myfun=$(nm -S a.out|grep )
myfun_addr=$(echo $myfun | awk '{print }')
myfun_length=$(echo $myfun | awk '{print }')
echo $myfun_length
myfun_end=$(echo "obase=16;ibase=16;$myfun_addr + $myfun_length" | bc)
offset=$(echo "obase=16;ibase=16;$myfun_addr - $start_addr" | bc)
最后一行运行,但前一行没有:
++ echo 'obase=16;ibase=16;0000000000400900 + 00000000000000bc'
++ bc
(standard_in) 1: syntax error
+ myfun_end=
++ echo 'obase=16;ibase=16;0000000000400900 - 0000000000400710'
++ bc
+ offset=1F0
bc中的十六进制数用大写字母表示。
尝试将 tr
添加到某个管道
... | tr "a-z" "A-Z" | ...
不要使用 IBASE 和 OBASE,这些需要小写。
您不需要使用 bc
。您可以为标准的$((...))
表达式指定十六进制值,然后使用printf
以十六进制输出。
start=$(nm -S a.out | grep -w _start)
start_addr=${start%% *} # Shorter, more efficient
myfun=$(nm -S a.out | grep "")
read myfun_addr myfun_length rest <<< "$myfun" # Shorter, more efficient
echo $myfun_length
myfun_end=$(( 0x$myfun_addr + 0x$myfun_length ))
printf -v offset "%x" $(( 0x$myfun_addr - 0x$start_addr" ))
我试图在以下可执行文件中找到 myfunc
的位置:
#include <stdio.h>
void myfunc(){
printf("Hello");
}
int main(){
}
我写了这个脚本:
#!/bin/bash -x
start=$(nm -S a.out|grep -w _start)
start_addr=$(echo $start | awk '{print }')
myfun=$(nm -S a.out|grep )
myfun_addr=$(echo $myfun | awk '{print }')
myfun_length=$(echo $myfun | awk '{print }')
echo $myfun_length
myfun_end=$(echo "obase=16;ibase=16;$myfun_addr + $myfun_length" | bc)
offset=$(echo "obase=16;ibase=16;$myfun_addr - $start_addr" | bc)
最后一行运行,但前一行没有:
++ echo 'obase=16;ibase=16;0000000000400900 + 00000000000000bc'
++ bc
(standard_in) 1: syntax error
+ myfun_end=
++ echo 'obase=16;ibase=16;0000000000400900 - 0000000000400710'
++ bc
+ offset=1F0
bc中的十六进制数用大写字母表示。
尝试将 tr
添加到某个管道
... | tr "a-z" "A-Z" | ...
不要使用 IBASE 和 OBASE,这些需要小写。
您不需要使用 bc
。您可以为标准的$((...))
表达式指定十六进制值,然后使用printf
以十六进制输出。
start=$(nm -S a.out | grep -w _start)
start_addr=${start%% *} # Shorter, more efficient
myfun=$(nm -S a.out | grep "")
read myfun_addr myfun_length rest <<< "$myfun" # Shorter, more efficient
echo $myfun_length
myfun_end=$(( 0x$myfun_addr + 0x$myfun_length ))
printf -v offset "%x" $(( 0x$myfun_addr - 0x$start_addr" ))