Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

macOS Application バイナリが持つentitlementを知りたい

$ codesign -d --entitlements :- /Applications/Hoge.app

アプリ例その1)

Executable=/Applications/Hoge.app/Contents/MacOS/Hoge
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.cs.allow-jit</key>
	<true/>
        <key>com.apple.security.cs.disable-library-validation</key>
	<true/>
	<key>com.apple.security.get-task-allow</key>
	<true/>
	<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
	<true/>
</dict>
</plist>

4つの意味をみていきます。

1. com.apple.security.cs.allow-jit

JavaScriptCore.framework などJITを使うライブラリの利用を許可します。

2. com.apple.security.cs.disable-library-validation

コードサイニングがないdylibの利用を許可します。

3. com.apple.security.get-task-allow

Xcodeデバッガでのアタッチを許可します。

4. com.apple.security.cs.allow-unsigned-executable-memory

MAP_JITフラグを使った書き込み、実行可能なメモリ領域の利用を許可します。

アプリ例その2)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.automation.apple-events</key>
	<true/>
	<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
	<true/>
	<key>com.apple.security.cs.disable-library-validation</key>
	<true/>
</dict>
</plist>

5. com.apple.security.automation.apple-events

他のアプリへAppleEventを送信することを許可します。ユーザーによる承認が必要になります。

NotarizationについてWWDC19 の動画に概要がまとまっていて分かりやすいです。

All About Notarization
https://developer.apple.com/videos/play/wwdc2019/703/

macOS コードサインを確認するコマンド

$ codesign -dvvv libblock.dylib
Executable=/Users/pebble8888/Library/Developer/Xcode/DerivedData/block-dfwlkkoafjhqccbfqxydkmopdyll/Build/Products/Debug/libblock.dylib
Identifier=libblock
Format=Mach-O thin (x86_64)
CodeDirectory v=20500 size=308 flags=0x10000(runtime) hashes=4+2 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha256=7e1a7a9848c075e7e9deb344c11d21922eebb2df
CandidateCDHashFull sha256=7e1a7a9848c075e7e9deb344c11d21922eebb2dfe766b88435e47da52e5d7669
Hash choices=sha256
CMSDigest=7e1a7a9848c075e7e9deb344c11d21922eebb2dfe766b88435e47da52e5d7669
CMSDigestType=2
CDHash=7e1a7a9848c075e7e9deb344c11d21922eebb2df
Signature size=4744
Authority=Apple Development: John AppleSeed (PYXS000000)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=May 2, 2020 22:18:06
Info.plist=not bound
TeamIdentifier=WAXD000000
Runtime Version=10.15.4
Sealed Resources=none
Internal requirements count=1 size=172

C++のシンボルテーブル

macにはnmというシンボルを見るコマンドがあります。

namespace MyNameSpace {

class MyObject {
public:
MyObject();
};

MyObject::MyObject()
{
printf("aa\n");
}

}

上記のコードをダイナミックリンクでコンパイルしたモジュールの出力をみてみます。


$ nm aa
0000000000000f70 T __ZN11MyNameSpace8MyObjectC1Ev
0000000000000f50 T __ZN11MyNameSpace8MyObjectC2Ev
0000000000002008 d __dyld_private
U _printf
U dyld_stub_binder

シンボルタイプの意味は以下です。

t - symbol is in the text (code) section - local
T - symbol is in the text (code) section - global/external
U - symbol is undefiend - global/external
b - symbol is in the uninitialized data (BSS) section - local
w - symbol is a weak symbol that has not been specifically tagged as a weak symbol
A - symbol value wont be changed by further linking - global/external
s - section symbol, local
S - section symbol, global

どうやら大文字がglobal/external、小文字がlocalのようです。

Xcodeの設定では、Symbols Hidden by Default がNoになっていますが、
Yesに変更してもう一度試してみますが変化なしです。

Other C++ Flags に -fvisibility=hidden を指定して試してみます。


$ nm aa
0000000000000f70 t __ZN11MyNameSpace8MyObjectC1Ev
0000000000000f50 t __ZN11MyNameSpace8MyObjectC2Ev
0000000000002008 d __dyld_private
U _printf
U dyld_stub_binder

最初の2つのTが小文字のtに変わりました。
わかりやすいように別の表示でみてみます。


nm

-C Decode (demangle) low-level symbol names into user-level names.
-D Display the dynamic symbols rather than the normal symbols, which is
only meaningful for shared libraries.
-g Display only external symbols.
-a Display all symbols, even debugger-only symbols.


$ nm -C aa
0000000000000f70 t MyNameSpace::MyObject::MyObject()
0000000000000f50 t MyNameSpace::MyObject::MyObject()
0000000000002008 d __dyld_private
U _printf
U dyld_stub_binder

C++のクラスのコンストラクタのシンボルがグローバルからローカルに変わったことを表しています。
要するにこのダイナミックリンクライブラリのこのシンボルが外部から呼び出せなくなったことを表します。

これはstaticをつけないC関数においても同じです。staticをつけたCの関数は内部リンケージと呼ばれシンボルテーブルにすらのらなくなります。

参考:

Shared Library Symbol Conflicts (on Linux)

ABC予想と宇宙際タイヒミューラー理論

ABC予想が何かという説明はここでは省きます。
整数論の未解決の難しい問題です。
tsujimotterさんのブログなどを参考にしてください。

これを解決したと言われているのが望月新一さんで使った新たな数学の理論が宇宙際タイヒミューラー理論だそうです。

以下のレクチャーノートが概要が掴みやすいです。
この理論自体は、(あくまでも私の想像ですが、)ガロアが群の概念を発明したように、数学の世界での新たな道具を発明したような感じなのかなと思っています。

道筋で、楕円曲線の理論が出てきますが、楕円曲線はほんとに素数と密接に関係があるんだなというのが実感できます。
最先端の整数論関連の知識をフル稼働しているんだなというのがみて取れます。
宇宙って名前付けが失敗している気がしますが、やっていることは、すごく数学的かつ論理的で、
時間をかけさえすればいずれは理解できるタイプのものなのかなという気がします。
まあ(人生をかける必要があるので)かけませんが。

宇宙際タイヒミューラー理論への誘い<レクチャーノート版>
望月新一(京大数理研)
2015年04月
1. Hodge-Arakelov理論的動機付け
2. Teichmuller理論的な変形
3. 対数・テータ格子
4. 宇宙際性と遠アーベル幾何

http://www.kurims.kyoto-u.ac.jp/~motizuki/Uchuusai%20Taihimyuuraa%20riron%20he%20no%20izanai%20(lecture%20note%20ban).pdf


イケメン数学者である加藤文元さんによるMathPowerイベントで行われた超ざっくりとした講演や書籍では、喩えを使って、雰囲気だけは伝えようとしてくれています。
喩えしかないので、数学的な話はほとんど出てきません。

宇宙と宇宙をつなぐ数学 IUT理論の衝撃

宇宙と宇宙をつなぐ数学 IUT理論の衝撃

www.youtube.com




なんだかそのうちリーマン予想も解かれるんじゃないかという気がしてきます。

美しい電子顕微鏡写真と構造図で見るウィルス図鑑101

本屋で見かけてなかなか面白そうな本だった。
ウィルスは細菌に比べても小さくて、正二十面体だったり、アポロ宇宙船のように幾何学構造だったりするのが、面白いね。
今回をきっかけにウィルス研究者が増えたりするかもね。