gendefのバグ?

GW後半に秋月で何気に AE-FT232HL を買いました。別に非同期シリアルが欲しかったわけではなく、PC上からポートをパタパタと手軽に出来る物が欲しかったのです。

PCがWin7だから制御はFTDI社製のD2XXを使えば良いのだけれども、GW前半にUrJTAGをlibftdi1仕様でコンパイルしていた経緯もあり、FT232Hもlibftdi1で制御しようと思ったのです。この作業中に少しはまってしまった事があるので備忘録代わりに書いておきます。

事の発端はlibftdi1の ftdi_get_library_version という関数を呼び出した時にリンカで "そんなのないぞ!!" と言われてしまった事です。libftdi1のヘッダーを見るとちゃんとあるし、libftdi1.dllの中身を見てもあるように見えます。色々とやってみて解ったのが、リンクする時に使う libftdi1.dll.a というライブラリが変だという事。これって、gendef と dlltool を使って libftdi1.dll から逆生成した物なんですよね。本当は自分で生成しなくても、libftdi1.dllを作成する時に副産物として出来てるはずなんですが、諸事情があり、cygwin + mingw 環境では作成していなかったので、やむなく逆生成したわけです。

libftdi1.dllを作成するには、cmakeを使う必要があって、これが厄介なために cygwin + mingw, msys + mingw での生成に失敗しただけなんですが…。因みに、使っている libftdi1.dll はLinuxでクロスコンパイルしました。

問題となったのは、gendef が吐き出す内容でした。今回使用する関数に限って以下の様な関数名で吐き出されていました。

ftdi_get_library_version@4


"@"以降が邪魔です。dlltoolで libftdi1.dll.a を生成した時もその中にマルッと書いてくれちゃってますので、リンカが "ftdi_get_library_version なんてないぞ!!" と言ってくる訳です。正直、WindowsのDLL、ライブラリ等のシンボル名に詳しくないので、"@"以降が必要かどうか全く解りません。が、これをクリアしないと先に進めないので、手動で編集した所、うまくコンパイル出来ました(実行も出来ています)。修正箇所が1カ所だけだったので手作業でも何とかなるのですが、今後の事も考えて以下の様にするとよいかもしれません。

$ gendef - ./libftdi1.dll | sed -e "s/@/;/" > libftdi1.dll.def
$ i686-w64-mingw32-dlltool.exe -d ./libftdi1.dll.def -D libftdi1.dll -l libftdi1.dll.a


"@" を ";" に置き換えているだけです。これで以降がコメント扱いになります。

因みに、Linuxでクロスコンパイルした時の副産物(libftdi1.dll.a, libftdi1.a)はcygwin + mingw上でも使える(同じ w64-minge32 を使用しています)のでコピーしてもよかった気もします。
スポンサーサイト

msysを使ったコンパイルで cygwin heap エラーが出る件(解決編)

MinGW build.blog に msys-1.0.dll のコンパイル方法が書いてありました。なので、何とか "Couldn't commit memory for cygwin heap" 問題 を解決したいな~と思っていました。いやいや、notabs.orgのサイトのおかげで解決はしているのですが、DLLを置き換えただけなので、何を変更されているのか知りたいというのが本音です。

ところが、それは私の注意が足りなかっただけで、前回は気がつかなかったのですが、win-build-env-005.7z を解凍した中に、msys-1.0.dllの変更前後のファイルが入っていました(msys-1.0.16)。なので差異を調べてみたところ、1カ所に修正が入っていて「ほ~、こんな修正方法なのか」といった内容でした。

ベースのソフトはmsys-1.0.16だったので、どの版にも反映出来るようにパッチを作成しました(【物置】)。MinGW build.blog の作成記事はでは現時点での最新版であるmsys-1.0.18で実行されていたので、これにパッチをあててコンパイルしてみました。

$ wget http://downloads.sourceforge.net/project/mingw/MSYS/Base/msys-core/msys-1.0.18-1/msysCORE-1.0.18-1-msys-1.0.18-src.tar.lzma?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmingw%2Ffiles%2FMSYS%2FBase%2Fmsys-core%2Fmsys-1.0.18-1%2F&ts=1366783604&use_mirror=jaist
$ mkdir msys-core
$ tar xJf ./msysCORE-1.0.18-1-msys-1.0.18-src.tar.lzma -C ./msys-core
$ cd ./msys-core/
$ ./msysrlsbld -e build_dep
$ export MSYSTEM=MSYS
$ export PATH=/bin:$PATH
$ patch -p2 < ../msysheap.patch
$ ./msysrlsbld

msysを閉じて、作成された msys-1.0.dll(msys-core/nstl/bin/) を MinGW/msys/1.0/bin へ念の為、オリジナルのバックアップを取ってからコピーします。これでmsysを起動できればOKです。試しに avr-gcc を作成してみましたが、問題なく出来ました。
この問題はネット上で言われているレジスタ値(heap_chunk_in_mb)の設定では解決しません。

因みに、Cygwinでregtoolを使ってレジスタ設定せた時の場所ですが、Win7 64bit版では HKEY_LOCAL_MACHINE¥SOFTWARE¥Wow6432Node¥Cygnus Solutions¥Cygwin になるようです。心当たりの場所を探してもなかったので、regeditの検索機能を使って確認しました。各環境によって場所が変わるのかもしれません。

Perlで拡張子変換

Perlの勉強がてら拡張子の変換プログラムを作ってみました。
前々から MBE のガーバデータの拡張子を Fusion PCB のに合わせるのを手動で行っていたのですが、これが結構神経を使うのです。なので、チョッとだけ軽減してくれるかなって感じです。

#!/usr/bin/perl

#
# MBEで作成したガーバデータの拡張子をFusionPCBに変換する
#

use File::Basename 'fileparse';

my $filepath = "./";

# ディレクトリオープン
opendir(DIRHANDLE, $filepath);

# ディレクトリエントリの取得
foreach (readdir(DIRHANDLE)) {
next if /^\.{1,2}$/; # '.'や'..'をスキップ

my ($basename, $dirname, $ext) = fileparse($_, qr/\..*$/);

my $convname = "";
if ($ext =~ /.cmp|.CMP/) {
$convname = ".GTL"
}
if ($ext =~ /.sol|.SOL/) {
$convname = ".GBL"
}
if ($ext =~ /.stc|.STC/) {
$convname = ".GTS"
}
if ($ext =~ /.sts|.STS/) {
$convname = ".GBS"
}
if ($ext =~ /.plc|.PLC/) {
$convname = ".GTO"
}
if ($ext =~ /.pls|.PLS/) {
$convname = ".GBO"
}
if ($ext =~ /.drd|.DRD/) {
$convname = ".TXT"
}
if ($ext =~ /.dri|.DRI/) {
$convname = ".DRI__"
}

print "$_ -> $basename$convname\n";

if ($convname ne "") {
rename $_, $basename . $convname;
}
}

# ディレクトリクローズ
closedir(DIRHANDLE);

C言語の定数配列の要素を抜き出す

プログラムを書いていると、既存のコードから定数配列や初期値付き変数の値を抜き出してリスト化したい時がある。そんな時、手動でシコシコと編集するのはめんどくさいので自動でトークンを抜き出してリスト化してくれる補助プログラムがあったらな~と思って作成してみた。

あくまで補助プログラムなので本格的なトークン解析は必要なし。入力するファイルの中身はある程度編集しておかないと行けない(配列名とかは無しで、配列の値部分だけのファイルを用意する)。トークンの分割には boost::tokenizer を使用している。

ソースコード

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
01 | 2017/02 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter