denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

readelfの問題が解決した

Raspi上の動作確認で、関数リストを作成できないという不具合が発覚しました。

 

実は、WindowsとRaspiでreadelfの出力に違いがあることは分かっていて、解析内容は同じなのですが、Raspiの方はコメントが日本語になっています。

 

Windows上のxc32-readelfの出力>
ーーーーーーーーーーーーーーーーーーーーーーーーーー
2017-08-22T14:31:25.412
Contents of the .debug_abbrev section:

Number TAG (0x0)
1 DW_TAG_compile_unit [has children]
DW_AT_stmt_list DW_FORM_data4
DW_AT_producer DW_FORM_string

<Raspi上のreadelfの出力>
ーーーーーーーーーーーーーーーーーーーーーーーーーー
2017-08-22T05:43:36.536
.debug_abbrev セクションの内容:

Number TAG (0x0)
1 DW_TAG_compile_unit [子あり]
DW_AT_stmt_list DW_FORM_data4
DW_AT_producer DW_FORM_string

 

ロケールをUKにするとコメントが英語になり、関数リストも期待通りに作成されました。メカニズムは分かっていませんが日本語のコメントが関数名の解析を妨げているようです。

 

対策として、Raspiの場合は”env LANG=en_us.UTF-8 ”を頭につけてreadelfを呼び出すことにしました。

 

こんな感じです
ーーーーーーーーーーーーーーーーーーーー
if( !isLinux() ){
    analyze_elf = readelf;
}
else{
    analyze_elf = "env LANG=en_US.UTF-8 "+readelf;
}

 

OSの種類をこんな風に取得し、

  String OS_NAME = System.getProperty("os.name").toLowerCase();

判定はこんな感じです 

boolean isLinux() {
    return OS_NAME.startsWith("linux");
}

 

f:id:denshikobo:20170823125429p:plain

この修正によりRaspiでも関数を指定できるようになりました。
(パチパチパチ~)