The Man Who Fell From The Wrong Side Of The Sky:2013年12月分

[最新版] [一覧] [前月] [今月] [翌月]

2013/12/8(Sun)

[Citrus] ISO-2022-ARIB(ARIB-STD-B24の8単位系)、eucJP-ARIB、Shift_JIS-ARIBのサポート

最近 Citrus iconvにARIB-B24デコーダーを組み込む ( blog) ( github) という記事を一年遅れで発見したので、 マージしました

なぜマージ先がNetBSD本家でなく、オレオレgit repositoryなのかについてはワイの事情なので特に説明しません、 お察し下さい

しがないSIerの過酷労働極安年収落書無用だとテレビ見る時間も買う金もないので、放送分野で使われる文字コードとかさっぱりなのですが、字幕放送とかFM文字多重放送で使われてるんですかね、お手軽に試せるサンプル希望。

ARIB-STD-B24 の仕様は こちらから。

ただそのままマージするには?な部分があったのですが、以下列挙すると

ちゅーところですか。

ISO-2022-ARIBという残念な名前(別にISO-2022-JPと互換性無いけどISO-2022-JP-ARIBでもいいのよ?)について、本家は「8単位符号」と称してるので、ARIB-8BITとかでもいいんですが。

人生Abend Calendar

人生Abend Calendarこと「sys/cdefs.hとは何か」の連載は、世の中Advent Calendarの時期で他に読むものいっぱいでしょ?、どーせ

後で読む(後で読むとは言ってない)

になるので連載中止中。

再開をしめやかにお待ちください、スッゾオラー!


2013/12/9(Mon)

[Citrus] 続・ARIB文字コード

昨日の記事に twitter で「 2009年度 OSS貢献者賞を受賞、Linux カーネル開発についての活動をしており、特にメモリー管理の大幅な改善の成果は、企業システム分野、組込み分野におけるLinux の飛躍的な性能向上に繋がっている。LKMLでの活動をもとに、日本語でLKMLの動向を平易に解説する「Kernel Watch」のWeb連載を行い、また、セキュリティ&プログラミングキャンプ4、コミュニティの勉強会などで、国内エンジニアの技術力向上や国外の開発者とのコミュニケーション力向上にも継続的に取り組むなど、日本のLinuxカーネル開発量の拡大へも影響を与えている」方と同一人物なのかは匿名であると主張する @kosaki55teaさんに、ARIB文字コードについていろいろ教えていただきました。本当に感謝です。

この記事の「前職でテレビ向けの組み込みソフトウェアを開発していて」時代の話ですね、インタビューされてる方と同一人物なのかは匿名なので判りませんが、匿名ってどういう意味だったか忘れてしまいそうです。

@tnozaki ARIBで0x7eがtildaであるべきってのはどこを見ればいいんでしょうか? http://t.co/lOAo7qx1yq 表7−5の定義だとオーバーラインなんです。なお実運用では各社チルダにしてるはず。そうしないとURLが表記できんから

— がちゃぴん先生ではないなにか (@kosaki55tea) December 8, 2013

@tnozaki なお、運用としてはデータ放送がEUC-JP(通常放送)/Shift_JIS(ワンセグ)、字幕 8単位(ISO2022-JP + 放送用特殊効果)、EPG 8単位のサブセット。

— がちゃぴん先生ではないなにか (@kosaki55tea) December 8, 2013

@tnozaki 字幕は文字じゃないのがたくさん入っているので、(あれはようするに tty animationをテレビに拡張したもんだから)、iconvではどうにもならん。横スクロールとか文字フラッシュとか、PNGとはどうしようもない

— がちゃぴん先生ではないなにか (@kosaki55tea) December 8, 2013

@tnozaki EPGについては送出側がパソコンで文字打ちする前提でサブセット作ったので変な文字はのきなみぶった切ったはず。

— がちゃぴん先生ではないなにか (@kosaki55tea) December 8, 2013

@tnozaki おおっと、忘れてた。文字多重放送はアナログ放送なのでB5を参照しているはずで別符号です。といっても実質同じですが。文字多重放送は需要がまったくないはずなので忘れましょう

— がちゃぴん先生ではないなにか (@kosaki55tea) December 8, 2013

@tnozaki 思い出した。そんな規定あったねえ。意図としてはWindowsと一致させたい(でないとコンテンツ作成業者死ぬ)だったと思います。円記号がだせるのは結果論。

— がちゃぴん先生ではないなにか (@kosaki55tea) December 9, 2013

@tnozaki なんか色々と思い出してきた。このクソわかりにくい章構成の一因はわたしにも原因があるのです。当初本文を書いてた人たちはEUC-JPとShift_JISが文字集合違うとかそういうのを意識してる人がいなくて、私ほか数名があとからイチャモンつけたんだよね。

— がちゃぴん先生ではないなにか (@kosaki55tea) December 9, 2013

( ・∀・)つ〃∩ヘェーヘェーヘェー データ放送が通常でEUC-JP、ワンセグでShift_JISとかどうしてそうなるwww

つまりは 未来情報産業ブログさんの

仕様策定メンバーの大半が文字コードの知識がなく、ごく数名、知識がある人が何とか頑張った、といった情景が思い浮かびます。

がおおむね正解であったという事ですね、そこに颯爽と血塗られたガチャピン先生がヒャッハー(以下惨劇

たぶん この画像みたいな光景だったのでしょう。

その結果、仕様書( pdf)の143ページ、「付録規定E UCSと8単位符号、EUC-JP、シフト JISの変換 ならびに、拡張文字・DRCSとの対応 」が追加されたという、ステキ。


2013/12/10(Tue)

[Citrus] 続々・ARIB文字コード

昨日の続きが まとまってます、この後もビデオフォーマットについても興味深い話が続きますが、それはそうと

. @tnozaki が鬼畜すぎて死にそう

— がちゃぴん先生ではないなにか (@kosaki55tea) December 9, 2013

tnozakiさんはつまんないギャグをつぶやいている暇があったら、クソ駄文を晒し者にされて恥ずかしい思いをしたわたしにあやまるべき

— がちゃぴん先生ではないなにか (@kosaki55tea) December 10, 2013

関係各位には 心からおわびを申し上げます反省しております


2013/12/21(Sat)

[自宅システム管理者] Windows XPのEOLに向けて(その1)

ちゅーことで実家PCのリプレース作業を考えてるわけですが、いろいろ頭痛い。

@ 対象マシン

こいつはもう6〜7年前に買ってきた DELL Dimension 9200Cで、Windows XP Media Center Edition + Microsoft Office2003 Personal プリインストールモデル、ディスプレイ込みで18万もしたのか(震え声)…

当時 Vista と Office2007 へのアップデートが送料のみで貰えたのでそれは注文してあったんだけど、ハードのスペックが酷過ぎて Vista とか無理ゲー *1なのよね…

ほげっ…こんなゴミはサクッと廃棄処分して新しいの買った方がマシやんけ…なんですが、そうすると今PCクソ高いので諸々で15万コース覚悟しないとね(白目)。

@ 予算問題

ここんとこ誰かがワイの藁人形に一生懸命五寸釘を打ちまくってるようで *2、ここ数ヶ月モノが壊れまくりで

とまぁ新しいPC買う金なんかネーヨちゅうことで。他にも仕事で本職でないネットワーク屋の真似事すんのに自腹で色々買ったしなぁ…

@ 近代化改修

てなわけで Vista のサポート切れる2017年までは姑息的延命措置を図る方針に転換していろいろ増強してみることに。科学ノ進歩、発展ニ犠牲ハツキモノデース。

@ 事前準備

このマシンはサイコーに頭狂ってる廃熱設計で有名なのよね。

なもんで買った瞬間ブートした瞬間からHDDの温度は常時44℃前後、ご丁寧にプリインストされたS.M.A.R.Tの温度警告がポップアップしまくりです、さすがウンコDELL。 こんなんが2005年度グッドデザイン賞という、あの賞の胡散臭さを裏付けとりますな。

そんで吸気するスリット部を外から掃除する事が不可能なデザインなので、使用して5年も経つとホコリで温度が下がらず爆音に。 ちなみにファン清掃するには、ほとんど完全分解に近い作業せんとこのファン外せないあたりももうねアホかと。

ちゅーことで完全分解してファンから何から全部洗浄しました、ファンから掃除機レベルの騒音出してたPCを平然と使い続けるあたり素人は恐ろしい。

ググると結構ファンを追加する改造してる人多いんだけど今回は見送りで。熱に自信ニキのWD赤茄子と交換するかねぇと。

@ 次回

実際に作業した姑息的延命措置を書いてく予定。


*1:とかいいつつ某コンサルの下で仕事してると未だにPentium4にメモリ512MBでeclipse + JBoss ASで開発したりするけどな(白目)
*2:心当たり?無いなぁ(すっとぼけ)
*3:艦○れ?ワイ擬人化ってどーにも苦手なんすよね…というか皆本当はペ□ペ□サイミンやってるんじゃないですか?(twitterのTLの艦こ○勢見ながら)


2013/12/22(Sun)

[自宅システム管理者] Windows XPのEOLに向けて(その2)

昨日のどーでもいい話の続き。

@ CPU

マザボのチップセットはG965 Expressで、FSBが1066MHzまでのウンコだからCPUは正直選択の余地があまりないのよね。よって失敗から学んだイーノック方式で一番いいのを頼む → Core2Quad Q6700を中古で買ってきました、7k強。

なお1333MHz対応マザーでもC2Qの最上位モデルQ9650は倍の中古価格で性能は大差ないしやっぱりQ6700を選ぶ模様。マザボがOC対応してたらQ6600の方が安上がりなんだろうけど、酷使されてアレかもね。

ちなみにてきとーなベンチ走らせてみた結果ワイのThinkPad X220のCorei7-2620MよりもQ6700の方が速いんだけど、こマ?

問題はE6300(TDP65W)からQ6700(TDP95W)に入れ替えて消費電力と発熱が大きく↑なんだけど、昨日も触れたクソな排熱設計とショボい電源(275W)が持つかどうか。 まぁこのマシンはPentium D915(TDP95W)モデルも存在したので、大丈夫かなーと。よーしパパ Optimistic / Radiohead 歌っちゃうぞー。

@ GPU

さすがに内蔵のGPUだとAeroは辛いし解像度もFullHD出ないのでグラボ増設したいんですが、さっきも書いたように排熱と電源がうーん。

トラブルの元になりそうな気がしないでもないけどPCI Express x16のスロット遊ばせておくのも勿体無いので、3000円台で Radeon 5450を購入、一番気に入ってるのは…値段だ。 発熱低めのファンレスモデルにしたけど逆に熱が逃げなくてダメかも。まぁ今は冬だし大丈夫しょ夏になったらマジメに考える。

@ メモリ

メモリは円高による異常な高騰っぷりで、なーにがアベノミクスじゃスタグフやんけksgと One Percent / Jane's Addiction の歌詞

biggest gang i know they call the government.
the gang and the government, no different that makes me one percent.

と絶唱しつつ新品のDDR2-800/PC2-6400を8GB分ポチりました、合計13kくらい。

ホントはマザボがDDR2-533/PC2-4200しかサポートしてないので、そこいらを中古で探せば5〜6kで揃うよなと思ってたんですが。 数日オクの相場を眺めてると、新品の2/3の8〜9kくらいまで上昇してるやんけ…それなら保証のある新品買いますやね。

@ ストレージ

DELLの設計担当って元は炊飯器か魔法瓶の設計をしてたと思うくらい熱が逃げない素晴らしい保温力。 ディスクは起動直後からいきなり44℃に達し、負荷が上がると長時間60℃超になっとる模様。これでよく6年も死ななかったなーSAMSUNGなのに。

とはいえS.M.A.R.TはなんJ民の手首かレベルでボロボロなので早急に交換が必要やね。容量が160GBしかないしそれよりなによりI/Oがとにかく遅い。 つーかこれまで一切バックアップを取らずディスクも故障せずホントに幸運な人たちですやね ハハハ。

こいつの内蔵SATAコントローラーはICH-8Rなので、DVDドライブ外してポート空ければRAID0/1が組めます、ただし

と会社をリストラされた中年リーマンのような悲哀が漂います。

ちゅーことで地デジ化で無用の長物と化したMedia Center Edition特有のアナログチューナー/ビデオキャプチャを引っこ抜いて 、空いたPCI Express x1にSATA3カードを増設することに。 あーまた出費だよ。

ここで以前別のマシンの増強用に買ったものの相性問題で宙に浮いてた 玄人志向 mSATA3I-PCIeを刺して、起動ディスクには Crucial M4 CT128M4SSD3を使うことに。合計18kくらいの出費?(今回新規で購入はしてないけど)

残るはデータ用のディスクとバックアップ用のディスク、増設したSATA3と内蔵のSATA2がそれぞれ1ポートづつ空いてます。

できれば空いてるSATA3にデータ、SATA2にバックアップ用ディスクをぶら下げたいところです。特にこのマシンは外部インタフェースがUSB2.0とIEEE134aちゅー遅いもんしかないし、NASを使うにも今時100BaseなNICがボトルネック。

そうなると省スペースPCの悲しい性で2.5inchのディスクしか選択肢がないのよね、熱に自信ニキの WD赤茄子2.5inch 1TBを2本載っけるしかもうないじゃん。

ただやっぱりバックアップ用ディスクはポータブルデバイスの方が何かと便利なんで、バックアップ速度に関してはUSB2.0で諦めました。 内蔵のデータディスクはWD赤茄子3.5inch 1TB、バックアップディスクはポータブルの WD Elements SE1TBちゅう構成で、合計17kくらいの出費。

@ 次回

ハードだけですでに出費が6万近くに達し魂が抜け出て行きそうな状態ですが、この金額で買える新品パソコンじゃこれ以下のスペックなので発狂せずにすんでる感。

次回はソフトでどんだけ散財したかの黙示録ですよ…


2013/12/23(Mon)

[自宅システム管理者] Windows XPのEOLに向けて(その3)

どーでもいいネタで3日目です。

@ OS

Vistaの無償アップデート貰ってんならそれでいいかと思ったんだけど、開けてびっくりクソザコナメクジなHome Basic/32bitだったのでこれは使えん。 まったくDELLもケチよな、元がXP Media Center Editionなので無償アプデならVista Home Premiumが筋なんだけど。

そもそもHome Basicへのアップデートは無料(+送料3000円)、Home Premiumは5600円(+送料3000円)で後者を注文したのに、ウンコDELLは前者を送ってきてカードの引き落としは後者やりやがったのだよ。 んでクレーム入れたそうなんだが、いつもの日本語怪しいどこの国の人なのよなサポートがのらりくらりかわすので、結局めんどくさくなって金取り戻すの諦めたらしい *1

んで今更Basic からAnytime Upgradeすると10kちょいかかるし、その値段ならメモリ増設にかこつけてDSP版買った方がマシなレベル。 つーかすでにAnytime Upgradeはパッケージ版もオンライン版も販売終了しとるわけでザッケンナー!スッゾコラー!

それとアーキテクチャ的にAnytime Upgradeでは32bitから64bitへのマイグレーションが無理なのも困る、今時メモリ3GB上限とかありえんし。 てかCOAに書かれてるシリアルって32/64bit共通なのでメディアさえ自分で用意できれば64bitでも認証通るはずなんだけど、OEMって DELLが32bit版のインストールメディア送ってきた時点でそいつに縛られちゃうので、ライセンス違反状態になるので(アカン)。

ちゅーことでDELLに8600円も払ったアップデートDVD + COAシールはしめやかに爆発四散。

かといってWindows8.1を買ってくるのもワイのサポートコスト的にノーなので、自分デスクトップマシン用のWindows7 Profesional通常版1ライセンス譲ることに。新品で30k(DSP版なら16k)くらいか。 ホントはパーツだけ買って組む暇なくて半年以上放置しているCorei7 3770にこれ入れるつもりだったんだけど、そいつは実験用に買ってあったWindows8 DSP入れますわ…

@ Office Suite

こっちはOEM版のOffice2003 Personal → 2007アプデあるので、パワポとか要らんし2017年までは使えるしでそのままインストールしてもよかったんだけど。 ただワイのOffice2010 Home & Businessが1台分余ってるのでそっち入れることに、Windows7 + Office2010とバージョン合わせといたほうが素人向け参考書選びも楽だしね *2

ただしOEMライセンスはポイするのは勿体無いので、 Office2013 Professional優待アップグレードを28k程度で購入、ライセンスをパッケージ版にロンダリング *3しときました。まぁOffice2003→2007は無料だったとはいえ送料3000円かかってるのでその分は勿体無かったけど。

これで将来的にOffice365の月額料金に囲い込まれるデストピアな世界になっても、2023年まではOffice Professionalを2台分確保ちゅーことで。

最大のネックはOffice2003からの乗換えなので、ワイですら発狂しかけたリボンUIが困り者なんだけど、 これが思いのほかよく出来てるので、これならすんなり移行できるかなと。

@ セキュリティ

今はPlatoonだかNorton360とかいう高いだけのゴミが入ってて自動更新でまだ200日以上期限残ってるけど、こいつも爆発四散で。

アンチウィルス/ファイアウォールはSecurity EssentialとWindows Firewallで十分なんですが、こないだの楽天優勝セールで ESETファミリーセキュリティ(5台まで)3年版を62%Offで買ってたので2016年まではそれで。サンキューAJマギー、ウェルカムユーキリス。

パスワードマネージャ機能もそもそも使ってないようだし、ブラウザのやつで十分だしまずはそのパスワード管理の教育からやね(今はパソコンの横に紙貼ってあるで…)。

@ バックアップ

バックアップ機能もNorton360すげー使いにくいし、クラウドストレージ2GBぽっちなら他のオンラインストレージサービスで十分(使ってないし)。 つーか個人向けバックアップソフトなら、操作ミスでファイル消したから5分前に戻したいを叶えるMacでいうところの タイムマシーンにおねがいの機能が無い時点でお金払う価値ないですわ。

んでTime machine機能については、Windows8以降は標準で File History機能あるけれどWindows7はあっ…(察し)なので、 Acronis True Image Lite 2013がお手頃価格 *4なので、購入してこいつの ノンストップバックアップ機能を使う事に。

機能を絞りこんであるし履歴からファイルを復元する操作も直感的で素人にも楽に使えそうなんですが、Acronisもオンラインストレージが自由に選べず容量もお値段もちょっとアレ。 まぁワイのポリシー的にバックアップ先はローカルドライブ以外信用しとらんので、使わないからどーでもいいです。

あとは素人が間違って消さないようにバックアップドライブを隠す機能がありゃいいんですが、まぁこれはautorun.infに何か仕掛けりゃいいかと。

@ その他ソフト

写真の整理とか編集に使ってるPhotoshop Elements 5は Windows7 未対応なのだけど *5、最新版の12にアップグレードするってゆーてもってかなり操作感変わってしまったらしいので困った…

つーことでまたしてもジャンクの箱漁ってると、買った事さえ記憶に無いPhotoshop/Premiere Elements 8(Windows7 対応OK)が発掘、ジャンク箱さえあれば東南アジアや中東の最前線でも生き残れそうだな。

思い出した、Premiere Elements 8の バグがあまりにも悲惨なので( 阿鼻叫喚の声をお聴き下さい)もうAdobe製品なんぞ金輪際買わないと決めてジャンク箱放り込んだんだったわ。

まぁバグでまともに動かんPremiere Elementsってのも論外だけど、Edius Neoも3 → 3.5のアプデで Firecoder Bluのサポートを切り捨てたのはクソやね、まぁ会社名がコロコロ変わる不安定な経営下で、負債でしかないSpursEngine/CELLに投資したくないのはわかるけど。 プロ用のEdius Proならわかるけど、アマ向けでこんなんやられたら信用できませんわ。誰もがCorei7ホイホイ買えるわけじゃないんやで…

Photoshop Elements 8の方は別に不具合らしいものは無かったので、これでお茶を濁そう。ダメならまだジャンク箱にはPhotoshop Lightroom 3がある。

あとはせいぜい周辺機器はプリンタのCanon PIXUS MP960くらいなもんで、これもWin7 64bit driverでてるし問題なさげ。 つーかプリンタなんて詰替インク買うより本体買い換えたほうが安いとかあるのに、この5年で何度も修理出してたっかい修理費用払ってんですかね…これだから素人は…

@ 結論

バブルがはじけた直後は誰もがまたあの株価に戻る日を信じていたけど結局戻らなかったように、2011年のタイ洪水前のパソコンパーツ相場にはもう永遠に戻らなさそうですね(遠い目)。


*1:振込詐欺と日々戦う老人特有の注意深さで注文時の画面キャプチャと伝票全部残ってるんで、商事時効5年過ぎてなければワイ直々に(略)したんだけどねー
*2:いまさらVista + Office2007へのマイグレーションとかやろうとすると、こういう素人向け参考書が本屋にはもう置いてなかったりするので要注意。
*3:時々勘違いしてる人いるけど、OEM版のOfficeもアップデート買えばパッケージ版と同等のライセンスになるので他のマシンでも使えるようになりますぜ。
*4:なおUSではCyber Mondayのセールで40% Offであったが おま国
*5:一応インストールもできたし、動作もOKっぽいけどね。


2013/12/26(Thu)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] sys/cdefs.hとは何ですか? (その15)

予告どおり Advent Calendar の季節が終わったので 人生 Abend Calendar 再開なり。

@ a.out フォーマットを理解する(準備編)

アッハイ、今時の gcc(1) で

$ cat >test.c
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
	puts("Hello, hello, hello, how low?");
	exit(EXIT_SUCCESS);
}
^D
$ gcc -### test.c
...
gcc version 4.5.3 (NetBSD nb2 20110806)
...
$ ls a.out
a.out
$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for NetBSD 6.1, not stripped
$

とかやっても a.out は a.out(5) ではなく elf(5) なのでちゃんと a.out(5) でコンパイルできる環境を用意する必要があります、アーヤヤコシ。

ただし

ちゅーことで古い NetBSD 入れるのが一番簡単ですやね。ELF 化されるのは 1.5 *1 なので、それ以前の環境を準備することにします。

@ 古い NetBSD 環境を用意する

yes(1) 様も大いにご立腹の「古い皮袋に新しいワインを注ぐ( マタイによる福音書 9章 17節)」行為で喜ぶのが N 界隈ですので *2、古い NetBSD が動く環境をなんて呟いた瞬間に 粗大ゴミ貴重なマシン(物理)が床抜ける勢いで届くので注意しましょう。

まぁ別に貴重なマシン(物理)でも 貴重なマシン(仮想)でも何でもいいんですが、ワイは無難に VMware を使います、Workstation10 / Player6 上で動作する NetBSD(i386) は 1.3 以降です *3

これより以前のバージョンの NetBSD/i386 を動かしたい場合は VMware ではなく Bochs の440BXエミュ(bx_generic)では動作するようです。 NetBSD-archive で公開されてない0.8と0.9が動くかは知らんですが、その辺も386BSDも動いてるようだし大丈夫でしょ(適当)。

ちなみに 1.2 以前のインストーラーは systinst(8) が存在しないちゅーか、bootable kernel-copy floppyを使ってのほぼ手作業でのインストールすな。 ワイもやったことありまへん。

そんでですね、若いのでついついバイナリの中身覗くのにGNU binutilsの objdump(1) とか便利なもん使おうとしてしまいますが NetBSD-1.3 にはそんなものはありません。

ELF化される直前の 1.4 だとbinutilsもフルセットで入ってobjdump(1)使えるし、このチラシの裏ネタもちょうど 1.4 から 1.5 への移行期の話だし、この辺入れとくのが無難かな *4

1.4ではこんなかんじ

$ gcc -v
Using builin specs.
gcc version egcs-2.91.60 19981201 (egcs-1.1.1 release)

$ as --version
GNU assembler 2.9.1
...

おっとld(1)ってバージョン表示する方法無いのか、GNU ld 2.9 だそうで。

@ 次回

実際にNetBSD-1.4を使ってa.out(5)の解説をしていく予定、もうobsoleteなもんだしあまり長い文章書きたくないなぁ。


*1:FreeBSD が 3.0 で ELF 化されてからだいぶ後になってからっすな、なお OpenBSD
*2:まぁ今や新しいワインか?すらも疑問ですが(ぉ
*3:NetBSD-1.3 のリリースは1998年1月、VMware がエミュレートする Intel 440BX の登場が1998年4月なのでそんなもんですかね、ABIT BP6にCeleron 300Aをdualで載せてオーバークロックで450動作?知らない世界だなぁ…
*4:あと1.3は非常に不安定で、ディスク負荷が高い状態だと頻繁にkernel panicするしね。


2013/12/27(Fri)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] a.out フォーマットを読み解く(その1)

またしても sys/cdefs.h の話から西か北かの如く脱線(意味深)していきますが、その日の気分で書いてるだけなので気にしてはいけない(戒め)

ニッキンキョーイク?!デンシャナンデ?!

@ NetBSD における a.out の実装

まず a.out(5) の構造を知る為に、 sys/exec_aout.h を読み解いていきましょう。

45 struct exec {
46         u_long  a_midmag;       /* htonl(flags<<26 | mid<<16 | magic) */
47         u_long  a_text;         /* text segment size */
48         u_long  a_data;         /* initialized data size */
49         u_long  a_bss;          /* uninitialized data size */
50         u_long  a_syms;         /* symbol table size */
51         u_long  a_entry;        /* entry point */
52         u_long  a_trsize;       /* text relocation size */
53         u_long  a_drsize;       /* data relocation size */
54 };

これがいわゆる a.out ヘッダ情報といわれるものです、この時点でファッ!?となった人は良く訓練されたパラノイド。

上記のとおり NetBSD において a.out ヘッダの各フィールドは MD(Machine Dependent) な u_long(=unsigned long) で定義されとります。 これ sizeof(struct exec) が i386 のような ILP32 環境では 32、amd64 のような LP64 環境だと 64 になってしまうので、file magic からの format 判定が辛いさんですやね。

ところがどっこいこれ心配ゴム無用なんですな。NetBSD において初の 64bit arch であった NetBSD/alpha ですが、こいつは a.out ではなく DEC Alpha マシンの上で動作する正妻である DEC OSF/1 → Digital UNIX → Tru64 UNIX と同じ ECOFF フォーマット *1を採用しており、その後改めて elf(5) フォーマットに移行しています *2

つまり 64bit な NetBSD において native な a.out バイナリって存在しないのですわ。

そしてここ重要、このヘッダファイルは 32bit arch 専用であって 64bit arch 上で includeしてはならない(戒め)

sysの下にあろうとも、あなたの予想に反して決して正しいヘッダ情報は得られません。 いつもの「MD/MIは分離されている(MD/MIは分離されてるとは言っていない)」ですやね、はぁ(溜息)。

@ 他の *BSDの場合

FreeBSD も OpenBSD もそんなアホな状態で放置せずにちゃんと s/u_long/uint32_t/ して MI(Machine Independent) になっとります。 FreeBSD では こんなん

112 struct exec {
113      uint32_t   a_midmag;       /* flags<<26 | mid<<16 | magic */
114      uint32_t   a_text;         /* text segment size */
115      uint32_t   a_data;         /* initialized data size */
116      uint32_t   a_bss;          /* uninitialized data size */
117      uint32_t   a_syms;         /* symbol table size */
118      uint32_t   a_entry;        /* entry point */
119      uint32_t   a_trsize;       /* text relocation size */
120      uint32_t   a_drsize;       /* data relocation size */
121 };

ただし本当はこれ exec_aout32 という名前の方が好ましいのかもしれません。

とゆーのも、ワイは現物見たことないのですが 64bit a.out 形式というトンデモ環境も存在するようで、 GNU binutils などに含まれる BFD(Binary Format Descripter) のドキュメントには 64bit a.out 形式についての言及があったりします、まーでもこれ demo64.c だから実際に採用した OS は存在しないっぽいね *3

@ えっ…これで COMPAT_NETBSD32 + EXEC_AOUT って動くの?

勘のいい人はピーンと来るかと思いますが、この sys/exec_*.h というのは execve(2) で kernel が実行形式を読み込むのに使うものなので、こんなダメダメな状態だとすると NetBSD/amd64 上の i386 互換モードで a.out 形式のサポートは期待するだけ無駄です。

事実 GENERIC kernel configでは

options         COMPAT_NETBSD32

はあれど

options         EXEC_AOUT

が無いのでデフォルトでは動きませんし、指定したところでそもそも src/sys/arch/amd64/amd64/netbsd32_machdep.c の中では

#ifdef EXEC_AOUT
/*
 * There is no native a.out -- this function is required
 * for i386 a.out emulation (COMPAT_NETBSD32+EXEC_AOUT).
 */
int
cpu_exec_aout_makecmds(struct lwp *p, struct exec_package *e)
{

	return ENOEXEC;
}
#endif

と ENOEXEC を返してるので、execve(2)は実行フォーマットエラーになりやがりますな。

まぁでもこんなん気にするパラノイアはおらんと思いますがね。他の *BSD では FreeBSD は 5 系で a.out サポートは叩っ切りましたし OpenBSDも最近消しましたな、いちおう src/sys/kern/exec_aout.cとか、MI化されてたんじゃないかって気はしますが。

@ NetBSD って後方互換性に自信ニキじゃなかったの?

さぁ?(投げやり) 最近は破壊に自信ニキしかおらんのでは?

まぁWin64環境ではWin16が動かなくなった程度のMicrosoftさんの互換性に対する努力には勝てませんやね。

@ 次回

まーた枝葉で1回分使ってしまった、次回はちゃんとヘッダの中身の説明をします。


*1:COFFとその子孫はまた次の機会に説明したいと思いますがまぁ a.out の進化系ですやね。
*2:kernel だけ elf(5)、userland は ECOFF な時期とかもあった模様。
*3:もしかして DEMOS (それは無い)。


2013/12/28(Sat)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] a.out フォーマットを読み解く(その2)

そういえば書き忘れていましたが a.out の語源は Assembler Output という何の捻りも無いアレです。

そもそもプログラミングに関する命名って捻りのない名前の方がいいよね、料理長が料理本で調理法をナイフとか意味不明な命名されるとギャー(3枚におろされました)。

@ a.out はひとつ!じゃない!!

複数のバージョンが存在します、これはa.outヘッダのmagicで区別することができます。 magicは exec 構造体a_midmag から取得できます。

ソースコードのコメントに

htonl(flags<<26 | mid<<16 | magic)

書かれているとおり a_midmag は network byte order な 32bit で、上から

という構造になっています。

マジックナンバーには以下の種類があります。

このうち NetBSD でサポートされるものは 定数マクロになってます。

57 #define	OMAGIC		0407	/* old impure format */
58 #define	NMAGIC		0410	/* read-only text */
59 #define	ZMAGIC		0413	/* demand load format */
60 #define	QMAGIC		0314	/* "compact" demand load format; deprecated */

このマジックを表示するための簡単なプログラムを書くとこんな感じ、昨日も書いたような理由で NetBSD 1.4/i386 でしか動作しないっす。

$ cat >magic.c
#include <sys/types.h>
#include <sys/exec_aout.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

int
main(int argc, const char *argv[])
{
	int fd;
	struct stat st;
	struct exec *ex;
 
	if (argc != 2)
		abort();
	fd = open(argv[1], O_RDONLY);
	if (fd == -1)
		abort();
	if (fstat(fd, &st) == -1)
		abort();
	if (!S_ISREG(st.st_mode))
		abort();
	ex = mmap(NULL, (size_t)st.st_size, PROT_READ,
	    MAP_FILE|MAP_PRIVATE, fd, (off_t)0);
	if (ex == MAP_FAILED)
		abort();
        printf("magic : %#lo\n", N_GETMAGIC(*ex));
	exit(EXIT_SUCCESS);
}
^D
$ make magic
cc -O2   -o magic magic.c
$ ./magic /netbsd
magic : 0413
$ ./magic /bin/sh
magic : 0413
$ ./magic /usr/bin/vi
magic : 0413

だー mmap(2) めんどくさいんじゃ、あと fcntl.h とかいう名前、何年Cやってても fctrl.h と typo するんや ちくしょーめ!

ちゅーことで a.out な NetBSD kernel/userland のマジックは8進で 0413 つまり ZMAGIC であることが判りますやな。

@ OMAGIC

OMAGIC(Old MAGIC) の名前は NMAGIC(New MAGIC) 登場後に便宜上つけられたものですが、フォーマット自体の歴史は古く既に Third Edition Unix の マニュアルにはすでに登場しています。

The header always contains 8 words:

     1  A magic number (407(8))
     2  The size of the program text segment
     3  The size of the initialized data segment
     4  The size of the uninitialized (bss) segment
     5  The size of the symbol table
     6  The entry location (always 0 at present)
     7  The stack size required (0 at present)
     8  A flag indicating relocation bits have been suppressed

マジック 0407、おっベイスターズが優勝するまでに必要な勝ち数か何かかな?

ちなみに OMAGIC は NMAGIC や ZMAGIC 登場後も *.o のようなリンク前のオブジェクトファイルとして使用されています。 もちろん NetBSD でも使われてとりまして

$ ./magic /usr/src/sys/arch/i386/compile/GENERIC/vers.o
magic : 0407
$ ./magic /usr/obj/bin/sh/main.o
magic : 0407
$ ./magic /usr/obj/usr.bin/vi/build/main.o
magic : 0407

ちゅう感じ。

OMAGIC より更に古い a.out としては First Edition Unix の マニュアルを読むと

The header always contains 6 words:

      1   a "br .+14"   instruction (205(8))
      2   The size of   the program text
      3   The size of   the symbol table
      4   The size of   the relocation bits area
      5   The size of   a data area
      6   A zero word   (unused at present)

とあって、最初はマジックナンバーではなく PDP-11のBR命令(無条件分岐、コード 0004xx)とそのオフセット(+14ワード)だったようです、こんな古い環境知らんがな(白目)。

@ NMAGIC

おっ、21世紀になるかならないかの頃モバイル用途で広く使われたが XFree86 が動かなくてみんな嘆いたGPUかな?(それは NeoMagic)

Forth Edition Unix の マニュアルで登場します。

The header always contains 8 words:

     1	A magic number (407 or 410(8))

Sixth Edition Unix の マニュアルだと更に NMAGIC と ZMAGIC の中間に

The header always contains 8 words:

     1	A magic number (407, 410, or 411(8))

と 0411 のマジックナンバーを持つものも存在してます。

0410 と 0411 の違いについては Seventh Edition Unix の マニュアルに詳しいですが、これはまた回を改めて説明します。

ちなみに [ON]MAGIC の名前がついたのはもっと後世で、この頃の ヘッダファイルでは

#define	A_MAGIC1	0407       	/* normal */
#define	A_MAGIC2	0410       	/* read-only text */
#define	A_MAGIC3	0411       	/* separated I&D */
#define	A_MAGIC4	0405       	/* overlay */

のように、MAGIC1〜4と番号振られてるだけですな。番号なんかで呼ぶな!私は自由なソフトウェアだ *1

また 2.9BSD では

#define	A_MAGIC5	0430       	/* auto-overlay (nonseparate) */
#define	A_MAGIC6	0431       	/* auto-overlay (separate)  */

ほげっ…さらに増えてるのね…

@ ZMAGIC

こいつは 3BSD で登場したようです、こっちも

#define	A_MAGIC1	0407		/* normal */
#define	A_MAGIC2	0410		/* read-only text */
#define	A_MAGIC3	0411		/* separated I&D (not on VAX) */
#define	A_MAGIC4	0405		/* overlay */
#define	A_MAGIC5	0413		/* demand page read-only text */

と、この時点では無名だった模様。

名前が [ONZ]MAGIC に整理されたのは 4BSD になってからですな。

#define	OMAGIC	0407		/* old impure format */
#define	NMAGIC	0410		/* read-only text */
#define	ZMAGIC	0413		/* demand load format */

@ QMAGIC

これワイ調べたけど由来が良くわかりません、 Linkers & Loader には BSD で採用されてるような事が書かれているのですが、 ZMAGICの改良版(省ファイルサイズ)みたいですやね。

NetBSD だと commitlog は 残ってるようですが、ちょうど例の裁判によって CVS から消されてるわでよう判りません。

FreeBSD の場合も この差分

The big 4.4BSD Lite to FreeBSD 2.0.0 (Development) patch.

という、な特雑コ(雑なコミットログ)によって放り込まれてるしなぁ。

ところが、 4.4BSD のソースみても無いんですよな…

/* Description of the object file header (a.out format). */
struct exec {
#define	OMAGIC	0407		/* old impure format */
#define	NMAGIC	0410		/* read-only text */
#define	ZMAGIC	0413		/* demand load format */
	long	a_magic;	/* magic number */

しかもこれ定数マクロが宣言されてるだけで、execve(2)のコード追っても QMAGIC の実行はサポートもしておらん風味、ふしぎ! まぁコメントに deprecated とあることだし忘れましょう(ぉ

@ CMAGIC

これは a.out 時代の Linux の core dumps がこの形式だったようです、 include/uapi/linux/a.out.h に定義されてますな。

/* Code indicating core file.  */
#define CMAGIC 0421

@ 次回

[ONZ]MAGICの違いについて説明する予定ですが、図を描かないとならんのでちょっと時間かかるかも。


*1:さすがに元ネタ観た事ないんですが、面白いんですかね?


2013/12/30(Mon)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] a.out フォーマットを読み解く(その3)

最近久しぶりに The Long Good-bye / Robert Altman を観たんですが、あまりにも日本語字幕の出来がヒドくてワイ将ギムレット噴いた模様。

物語の冒頭「まっずいまっずいネコマンマ(笑)はポイーで」とあらぶるネコ様 *1相手に

think of all the tigers in india they're killing cos they don't get enough to eat.
インドのトラ達は(飢饉で)腹空かして死んでるんだぜ?

と私立探偵(private eys)に特有のへらず口(wisecrack)をキメる、Elliott Gould 演ずるマーロウの(原作とはまた異質な)キャラを表すシーンがあるんですが、これが日本語字幕になると

困った奴だ。

の一言で流されてファッ?!となりまんた。ソッコー英語字幕に切り替えた後、ワイの内なる翻訳者ブラックリスト入りに。

いやホントこれ、字幕をとある大御所 *2にやらせて

タイガース vs インディアンズ戦がコトかもだ、ヤツらは食事を?

の方がまだマシな翻訳な気がするんですがそれは。

ラストの台詞もネタバレにならない程度に書くと

yeah, i even lost my cat.
そうだよ(便乗)、おまけにネコにまで逃げられた(ズドン)

そうかもしれん。

とか台無しですわ、クソクソアンクソ。

つーか原作と異なるラスト自体がクソクソアンクソいう チャンドラー*3原理主義者多いですが、ワイはどっちも好きです(憤怒)。

な阪関無

@ mid(Machine IDent) 情報を見てみる

前回の magic.c を書き換えて mid(Machine Ident) を表示するように修正しましょう。

$ diff -uBw magic.c.orig magic.c
--- magic.c.orig        Sun Dec  8 15:37:51 2013
+++ magic.c     Sun Dec  8 15:38:09 2013
@@ -25,5 +25,6 @@
        if (ex == MAP_FAILED)
                abort();
        printf("magic : %#lo\n", N_GETMAGIC(*ex));
+       printf("mid   : %#ld\n", N_GETMID  (*ex));
        exit(EXIT_SUCCESS);
 }
$ make magic
cc -O2   -o magic magic.c
$ ./magic /netbsd
magic : 0413
mid   : 134
$ ./magic /bin/sh
magic : 0413
mid   : 134
$ ./magic /usr/bin/vi
magic : 0413
mid   : 134
$ ./magic /usr/lib/libc.so.12.40.2
magic : 0413
mid   : 134

midとして10進数で134が表示されましたが、この値が何かといいますと exec_aout.h (HEADでは aout_mid.h に分離)に定数マクロ化されています。

62 /*
63  * a_mid - keep sorted in numerical order for sanity's sake
64  * ensure that: 0 < mid < 0x3ff
65  */
66 #define MID_ZERO        0       /* unknown - implementation dependent */
67 #define MID_SUN010      1       /* sun 68010/68020 binary */
68 #define MID_SUN020      2       /* sun 68020-only binary */
69 #define MID_PC386       100     /* 386 PC binary. (so quoth BFD) */
70 #define MID_HP200       200     /* hp200 (68010) BSD binary */
71 #define MID_I386        134     /* i386 BSD binary */
72 #define MID_M68K        135     /* m68k BSD binary with 8K page sizes */
73 #define MID_M68K4K      136     /* m68k BSD binary with 4K page sizes */
74 #define MID_NS32532     137     /* ns32532 */
75 #define MID_SPARC       138     /* sparc */
76 #define MID_PMAX        139     /* pmax */
77 #define MID_VAX         140     /* vax */
78 #define MID_ALPHA       141     /* Alpha BSD binary */
79 #define MID_MIPS        142     /* big-endian MIPS */
80 #define MID_ARM6        143     /* ARM6 */
81 #define MID_POWERPC     149     /* big-endian PowerPC */
82 #define MID_HP300       300     /* hp300 (68020+68881) BSD binary */
83 #define MID_HPUX        0x20C   /* hp200/300 HP-UX binary */
84 #define MID_HPUX800     0x20B   /* hp800 HP-UX binary */

前々回も書いたとおり、NetBSD/alpha では ECOFF が採用されてるはずなのですが MID_ALPHA なるものも定義されてますな *4ログ見る限りでは将来的に予約しただけっぽいです、詳しいことは知らん。つーか1994年とかパソコンなんぞ触ったことすらなかったですわ。

ちなみに GNU BFD の方を見ると

enum machine_type
{
...
  M_ALPHA_NETBSD = 141,   /* NetBSD/alpha binary.  */
}

ばっちり NetBSD/alpha と書いてあるので、他の *BSD 由来でない事はたしかっぽい。

ともあれ、このマシンID情報を見ることで execve(2) は異なる OS/arch の a.out バイナリの実行を避ける(あるいはエミュで実行する)ことが可能になっとります。

@ フラグ情報を見てみる

さっきの magic.c にもう一行追加。

$ diff -uBw magic.c.orig magic.c
--- magic.c.orig        Mon Dec  9 18:47:12 2013
+++ magic.c     Mon Dec  9 18:48:49 2013
@@ -26,5 +26,6 @@
                abort();
        printf("magic : %#lo\n", N_GETMAGIC(*ex));
        printf("mid   : %#ld\n", N_GETMID  (*ex));
+       printf("flag  : %#lx\n", N_GETFLAG (*ex));
        exit(EXIT_SUCCESS);
 }
$ make magic
cc -O   -o magic magic.c

このフラグもこれまでと同様に 定数マクロ化 以下略。

88 /*
89  * a_flags
90  */
91 #define EX_DYNAMIC	0x20
92 #define EX_PIC	0x10
93 #define EX_DPMASK	0x30

実際にフラグ情報を見ていきましょう、静的リンクされている kernel や sh(1) *5 などでは

$ ./magic /netbsd
magic : 0413
mid   : 134
flag  : 0
$ ./magic /bin/sh
magic : 0413
mid   : 134
flag  : 0

フラグは0です。

動的リンクである vi(1) の場合

$ ./magic /usr/bin/vi
magic : 0413
mid   : 134
flag  : 0x20

と、EX_DYNAIC(動的リンク)フラグが立ってますな。

共有ライブラリである libc の場合

$ ./magic /usr/lib/libc.so.12.40.2
magic : 0413
mid   : 134
flag  : 0x30

EX_DYNAIC プラス EX_PIC(位置独立)フラグも立ってります。

このフラグ情報は ld(1)rtld(1) で使われますが、詳しくはまた後日説明で。

@ 次回

なんかもうLinkers & Loaders とか 386BSD本を読めでいいような気がしてきた。

@ おまけ

a.out時代のNは、わざわざ壊れてないものを直しにいったりしなかった気はする。なので、a.outのu_longみたいなのを「壊れてないから直さない」で放置してても不思議ではない

— AoiMoe (@AoiMoe) December 29, 2013

壊れてもいないのにstdint使うように直してエンバグする、みたいな事故をしばしば見かけるようになったのは、それより後の気もする

— AoiMoe (@AoiMoe) December 29, 2013

すでに壊れてるんじゃないですかねぇ。64bit arch で MI な a.out.h(あるいはsys/exec_aout.h) を include しても正しく a.out バイナリのヘッダ読めないんですから。

つか このコミットのように、lint(1)でコケた → 黒ヤギさんはコード読まずにキャストしてコンパイル通るようにした(正常に動作するとは言っていない)ちゅーその場凌ぎが蔓延してるから事故るわけで。


*1:ネコ「僕自身 横浜家を出ていく喜びもあった」
*2:原作を翻訳した清水俊二の弟子かどうかは知らん
*3:ThinkPad 235って何のことか判らないな。
*4:ちな FreeBSD だと imgact_aout.h には無いでございます
*5:現在のNは full dynamically linked root なので sh(1) すら動的リンクですけど。 ( ^ω^) libc 破壊して困ったら /stand 使うじゃろ。( ^ω^)もう libc 触る奴なんておらんか。


[ホームへ] [ページトップへ]