2015-12-03 68 views
1

我試圖找到可執行的myfunc位置:BC(standard_in)1:語法錯誤

#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 $1}') 
myfun=$(nm -S a.out|grep $1) 
myfun_addr=$(echo $myfun | awk '{print $1}') 
myfun_length=$(echo $myfun | awk '{print $2}') 
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 
+0

我真的很想知道downvote的原因。這是我第一次使用'bc'。這兩條線看起來幾乎相同,都有有效的變量。許多環境都接受大寫和小寫十六進制數字。所以請解釋你爲什麼投下這個問題。 – robert

+0

只是一個猜測downvote:沒有C參與任何問題或可能的答案。 – pmg

+0

與其他Stackexchange網站不同,這裏有一些真正的瑣碎用戶。 – robert

回答

5

bc中的十六進制數字用大寫字母表示。

嘗試增加tr一些管

... | tr "a-z" "A-Z" | ... 

不要使用IBASE和obase的,這些都需要小寫。

4

您不需要使用bc。您可以爲標準$((...))表達式指定十六進制值,然後使用printf以十六進制輸出。

start=$(nm -S a.out | grep -w _start) 
start_addr=${start%% *} # Shorter, more efficient 
myfun=$(nm -S a.out | grep "$1") 
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")) 
相關問題