⑴ Node.js浣跨敤ffi-napi,ref-napi,ref-array-napi,ref-struct-napi璋幂敤锷ㄦ佸簱
浣跨敤electron寮杩涜屾岄溃绋嫔簭镄勫紑鍙戯纴浼间箮鎴愪简WEB鍓岖寮鍙戜汉锻樿浆妗岄溃绋嫔簭寮鍙戠殑棣栭夈傝繎链熸湁涓浜涗娇鐢ㄥ湪electron涓浣跨敤锷犲瘑阌佺殑闇姹傦纴瀛︿範浜嗕竴涓嫔湪Node.js涓阃氲繃ffi-napi妯″潡璋幂敤锷ㄦ侀摼鎺ュ簱锛屾妸鍑犳惧姞瀵嗛挛浜у搧镄勫姩镐佸簱浣跨敤javascript灏佽呬简涓涓嬶纴瀹炵幇浜唀lectron涓浣跨敤锷犲瘑阌佸姛鑳姐
寮鍙戣繃绋嬩腑阆囧埌浜嗕竴浜涢梾棰桡纴韪╀简涓浜涘潙锛岃繖閲屾荤粨璁板綍涓涓嬨傝繖閲屼娇鐢ㄦ帴鍙e嚱鏁板弬鏁扮被鍨嬫瘆杈冨嶆潅镄凴OCKEY-ARM镄勫姩镐侀摼鎺ュ簱𨱒ヨ繘琛屽紑鍙戙
NOTE: javascript灏佽呯殑ROCKEY-ARM鎺ュ彛妯″潡婧愮爜锛屾垜宸茬粡鍒嗕韩鍑烘潵锛屽傛灉鍙鏄闇瑕乪lectron鎴栬匩ode.js宸ョ▼涓浣跨敤ROCKEY-ARM镄勭绣鍙嬶纴鍙浠ョ洿鎺ヤ娇鐢ㄣ
棣栧厛闇瑕佸湪node.js椤圭洰涓瀹夎呰皟鐢ㄥ姩镐侀摼鎺ュ簱镞堕渶瑕佷緷璧栫殑妯″潡 ffi-napi,ref-napi,ref-array-napi,ref-struct-napi 銆
涓嬮溃澶ф备粙缁崭竴涓嬭繖鍑犱釜妯″潡镄勭敤阃旓细
钖 椋炲ぉ璇氢俊 璐涔癛OCKEY-ARM锷犲瘑阌佷骇鍝侊纴鍙浠ヨ幏寰桼OCKEY-ARM镄凷DK锛屽彲浠ヨ幏寰梂indows鍜孡inux镄勫姩镐侀摼鎺ュ簱锛屾枃浠跺悕涓鑸涓箧ongle_d.鍜宭ibRockeyARM.so.0.3銆
ffi-napi鏀鎸乄indows锛孡inux绯荤粺锛屾墍浠.dll鍜.so閮藉彲浠ユ敮鎸侊纴鍦ㄤ笉钖岀殑镎崭綔绯荤粺涓嫔幓锷犺浇涓嶅悓镄勫姩镐佸簱鏂囦欢灏卞彲浠ヤ简銆傚姞杞藉姩镐佸簱镄勬柟娉曞备笅:
Library()绗涓涓鍙傛暟鏄.dll镄勮矾寰勶纴linux绯荤粺鏄.so镄勮矾寰勚傜浜屼釜鍙傛暟rockeyInterface鏄锷ㄦ佸簱瀵煎嚭鍑芥暟镄勫0鏄庯纴ROCKEY-ARM镄勫煎嚭鍑芥暟姣旇缉澶氾纴鎴戝崟镫𨰾垮嚭𨱒ュ畾涔夈傚叿浣扑笅闱浼氲插埌銆
棣栧厛浠嶳OCKEY-ARM涓镓惧嚑涓鍙傛暟绠鍗旷殑鍑芥暟𨱒ュ0鏄庝竴涓嬨
棣栧厛鐪嬩竴涓嬩笂闱㈠嚑涓鎺ュ彛鐢ㄥ埌镄勬暟鎹绫诲瀷链:DONGLE_HANDLE,DWORD,DONGLE_HANDLE ,int,BYTE 杩椤嚑绉嶃
鍐岖湅涓媐fi-napi鏀鎸佺殑ref-napi鏀鎸佺殑鏁版嵁绫诲瀷链変互涓嬬被鍨嬶细
鍙傛暟杩欓噷搴旇ョ敤闀垮害涓镊寸殑鏁版嵁绫诲瀷锛屽彲浠ユ湁浠ヤ笅鍖归厤銆
澹版槑镄勫啓娉曞备笅锛
涓涓猨son锛宬ey鏄锷ㄦ佸簱瀵煎嚭鍑芥暟钖嶏纴姣斿'Dongle_Open'锛寁alue鏄涓鍒楄〃锛岀涓涓鍏幂礌鏄杩斿洖鍊硷纴绗浜屼釜鍏幂礌鏄鍙傛暟銆傚叾涓鍙傛暟杩樻槸涓鍒楄〃銆傝繖涓猺ef-napi涓链夐傚悎绫诲瀷镄勶纴鐩存帴鍐欑О鍏蜂綋绫诲瀷鍗冲彲锛屾瘆濡傝繑锲炲糄WORD鍜屼紶鍏ョ殑闀垮害int锛屾垜杩欓噷閮界敤'int'銆傚叾浠栫殑鍙傛暟鎴戦濆栧畾涔変简鍙ユ焺ryHandle銆佸彞镆勭殑鎸囬拡ptrHandle銆佸瓧鑺傜殑鎸囬拡ptrByte銆傚叾涓璻yHandle锛宲trryHandle锛宲trByte镄勫畾涔夊备笅锛
DONGLE_HANDLE链璐ㄦ槸void *绫诲瀷, void* 绫诲瀷链寮濮嬬殑镞跺椤勫浘瀹氢箟涓涓獀oid镄勬暟缁勶纴铹跺悗鐢╲oid鏁扮粍𨱒ヨ〃绀簐oid 锛岀劧钖庡彂鐜版姤鏂瑷阌栾锛屾暟缁勪笉鏀鎸乿oid绫诲瀷銆傛墍浠ュ氨鐩存帴鐢ㄦ棤绗﹀彿鏁版潵琛ㄧずvoid鎸囬拡锛屽湪64浣岖郴缁熸槸8瀛楄妭锛32浣岖郴缁熸槸4瀛楄妭锛屼娇鐢╱int绫诲瀷灏卞彲浠ヤ简銆侱ONGLE_HANDLE 銆
鍦≧OCKEY-ARM镄勫嚱鏁颁腑涔熸湁寰埚氩甫鍙傛暟镄勬帴鍙o纴姣斿傦细
𨰾夸互涓娄袱涓鍑芥暟鎺ュ彛涓句緥锛娈ongle_Enum涓镄勭涓涓鍙傛暟鏄涓涓鎸囧悜DONGLE_INFO缁撴瀯浣撶殑鎸囬拡锛岃繍琛屽悗杩斿洖璁惧囦俊鎭镄勫垪琛锛屼娇鐢≧OCKEY-ARM镄勬椂鍊欓渶瑕侀氲繃鏋氢妇鍑芥暟銮峰缑璁惧囦俊鎭鍒楄〃锛岀劧钖庢瘆杈冧骇鍝両D鎴栬呯‖浠禝D鍐冲畾镓揿紑鍝涓涓璁惧囥备负浜嗘柟渚夸粠鏋氢妇鍑芥暟杩斿洖镄勮惧囦俊鎭涓鏂逛究镄勮В鏋愬嚭浜у搧ID鎴栬呯‖浠禝D绛変俊鎭锛岄渶瑕佹妸DONGLE_INFO* pDongleInfo杩欎釜鍙傛暟澹版槑鎴愪竴涓缁撴瀯浣撴暟缁勚侱ongle_RsaGenPubPriKey()鍑芥暟涓链塕SA_PUBLIC_KEY ,RSA_PRIVATE_KEIY 涓や釜缁撴瀯浣撴寚阍埚弬鏁帮纴锲犱负鍦ㄨ繖閲屼竴鑸鐢ㄦ埛骞朵笉闇瑕佽В鏋怰SA瀵嗛挜涓镄刵,d,e绛夊垎閲忥纴鍙浠ョ洿鎺ュ仛浣滀负涓涓瀛楄妭鏁扮粍锛岀洿鎺ュ0鏄庢垚涓婇溃镄刾trByte绫诲瀷鍗冲彲銆傛墍浠ュ湪澹版槑濡备笅锛
璋幂敤ffi-napi澹版槑镄勫嚱鏁帮纴涓昏佹槸缁栾嚜宸卞畾涔夌殑鏁版嵁绫诲瀷璧嫔埯鍊间互鍙婅幏寰楄嚜瀹氢箟鍙傛暟镄勮繑锲炲笺备笅闱㈠垎鍒璇存槑銆
杩欓噷镄刬nt*锛屾槸璁╁嚱鏁拌繑锲炶惧囩殑鏁伴噺锛屾垨钥呬紶鍏ヨ緭鍏ユ暟鎹镄勯暱搴︽垨钥呬紶鍑鸿緭鍑烘暟鎹镄勯暱搴︼纴镓浠ュ彧瑕佸畾涔変竴涓闀垮害涓1镄刬nt鏁扮粍鍗冲彲锛屽备笅锛
缁欎紶鍏ョ殑鏁版嵁璧嫔硷纴鍙瑕佺粰涓嬫爣涓0镄勫厓绱犺祴鍊煎嵆鍙銆
杩欎釜鍙傛暟鏄鏋氢妇鍑芥暟浼犲嚭鏋氢妇鍒拌惧囦俊鎭镄勫垪琛锛屾灇涓惧埌澶氩皯璁惧囷纴灏变紶鍑哄氩皯涓狣ONGLE_INFO锛屾墍浠ラ渶瑕佷紶鍏ヨ冻澶熸暟閲忕殑镄凞ONGLE_INFO锛屽备笅锛
杩欎釜鍙傛暟涓鑸鏄浣滀负浼犲叆浼犲嚭鏁版嵁镄勭紦鍐插尯镄勶纴镓浠ュ垱寤烘暟缁勭殑镞跺欙纴闇瑕佸垱寤鸿冻澶熼暱镄勭┖闂达纴濡备笅锛
寮鍙戠殑杩囩▼涓锛岃俯鍒颁竴浜涘潙钥借浜嗕笉灏戞椂闂达纴杩欓噷镐荤粨涓涓嬨
ROCKEY-ARM镄勭粨鏋勪綋鏄鎸夊瓧鑺傚归绨镄勶纴ref-struct-napi娌℃湁镓惧埌璁剧疆瀛楄妭瀵归绨镄勬柟娉曘傚綋镞跺0鏄庣殑缁撴瀯浣揿备笅锛
娴嬭瘯镄勬椂鍊欎细鍙戠幇瀹氢箟镄勭粨鏋勪綋鍜孯OCKEY-ARM瀹氢箟镄勭粨鏋勪綋瀵归绨鏂瑰纺涓崭竴镙凤纴浜庢槸鎶妋_Birthday鍜宫_HID涓や釜鎴愬憳浠巖ef.types.uint64锛屾媶鍒嗘垚宸﹀彸涓や釜uint32锛岃繖镙峰氨鍙浠ヨ╃粨鏋勪綋瀵归绨鏂瑰纺鍜孯OCKEY-ARM镄勪竴镊淬备娇鐢╩_Birthday鍜宫_HID镄勬椂鍊欙纴闇瑕佽插乏鍙充袱涓猽int32𨰾兼帴涓浜涳纴绋嶅井楹荤储涓镣癸纴浣嗘槸鍦ㄦ病镓惧埌閰岖疆StructType瀵归绨鏂圭殑𨱍呭喌锛屼缭璇佺粨鏋沧g‘锛岃缮鏄鍙浠ユ帴鍙楃殑銆
⑵ DelphiforLinux涓搴旂敤鍏变韩瀵硅薄搴
1. Delphi for Linux鏄叠orland鍏鍙告帹鍑虹殑锘轰簬Linux骞冲彴镄勯溃钖戝硅薄镄勫彲瑙嗗寲寮鍙戝伐鍏凤纴鏄鐩鍓峀inux骞冲彴涓婂緢濂界殑搴旂敤寮鍙戝伐鍏枫侱elphi for Linux涔熺ОKylix锛屽紑鍙戣呯敤Kylix寮鍙慙inux搴旂敤绋嫔簭镞讹纴鍙鑳戒细浣跨敤鍒癓inux镎崭綔绯荤粺链韬甯︾殑澶ч噺SO鏂囦欢銆
2. SO鏄涓绉岖壒娈婄殑杩愯屾枃浠讹纴鍖呭惈鑻ュ共鏂规硶銆佸硅薄鍜岃祫婧愩傚畠涓嶈兘鐩存帴杩愯岋纴浣嗗彲浠ヨ獽ylix搴旂敤绋嫔簭鎴栧叾浠栧彲镓ц屾枃浠跺姩镐佽皟鐢ㄣ係O鏂囦欢镓╁𪾢钖崭负so銆傜紪璇戝墠婧愭枃浠舵墿灞曞悕涓篸pr銆傛湰鏂囨墍涓句緥瀛愬潎鍦≧ed Hat Linux鍙奒ylix鐜澧冧笅璋冭瘯缂栬疟阃氲繃锛屽苟鍙姝e父杩愯屻
3. SO搴撴枃浠剁殑缁勬垚鍜孠ylix镙囧嗳鍗曞厓鏂囦欢镄勫唴閮ㄧ粨鏋勫熀链鐩稿悓锛屼篃链夊0鏄庛佸疄鐜板强鍒濆嫔寲閮ㄥ垎銆傚尯鍒涔嬩竴鍦ㄤ簬SO搴揿彧鏄鍏朵粬绋嫔簭鍙浠ヨ皟鐢ㄧ殑鏂规硶锛埚寘𨰾鍑芥暟鍙婅繃绋嬶级闆嗗悎銆傚尯鍒涔嬩簩锛屽簱绋嫔簭浠library鍏抽敭瀛楄岄潪project寮澶村惎锷ㄥ叾椤圭洰鏂囦欢銆傚簱绋嫔簭鍖呭惈链塭xports璇鍙ワ纴鍏跺垪鍑鸿佸悜澶栭儴鎻愪緵镄勫煎嚭鍑芥暟鍙婅繃绋嬨
4. 鍏变韩瀵硅薄搴撶殑鍒涘缓锛孲O搴撴枃浠剁殑鏋勬垚锛屽嚱鏁伴吨杞斤纴鐗规畩缂栬疟鎸囦护锛岄噰鐢―elphi for Linux鍒涘缓SO镄勭紪绋嬭勫垯锛屼娇鐢ㄥ墠镄凩inux绯荤粺璁剧疆锛屼互鍙婂湪Delphi for Linux涓鐢ㄩ殣寮忔垨鏄惧纺阈炬帴鏂规硶瑁呭叆鍜屼娇鐢⊿O鍑芥暟镄勫熀链鏂规硶锛岀粡楠屽强鎶宸э纴骞跺瑰簲鐢⊿O鍙鑳藉嚭鐜扮殑闂棰樿繘琛屼简鎺㈣ㄥ拰鍒嗘瀽銆
5. 鍏变韩瀵硅薄搴揿熀链姒傚康锛氩氢釜Kylix绋嫔簭鎴栧畠镄勫氢釜鍗曞厓鏂囦欢鍙阃氲繃鎺ュ彛鍏辩敤涓涓猄O搴撴枃浠讹绂镆愪竴涓狵ylix绋嫔簭鍙阃氲繃澶氢釜鎺ュ彛浣跨敤澶氢釜SO搴撴枃浠讹纴杩欐牱SO鍙樻垚涓绉嶅彲鍏辩敤镄勮祫婧愶纴瀹炵幇鐪熸g殑璧勬簮鍏变韩锛屽ぇ澶х缉灏忎简Kylix搴旂敤绋嫔簭镄勬墽琛屼唬镰侊纴澧炲己浜呜蒋浠剁殑鍙閲岖敤镐с
6. 灏哠O鏂囦欢浣滀负Kylix搴旂敤绋嫔簭镄勫叕鍏辫皟鐢ㄦā鍧楄捐℃椂锛岀敱浜庡叾镫绔嬩簬搴旂敤绋嫔簭锛岃蒋浠跺崌绾ф椂鍙闇淇鏀笋O搴撴枃浠跺强缂栬疟SO锛屾棤闇镟存敼鍙婇吨缂栬疟Kylix搴旂敤涓荤▼搴忋
7. 涓崭粎鍙浣跨敤Kylix缂栧啓SO搴掳纴杩桦彲浣跨敤C鎴朇++绛夊父鐢ㄨ瑷𨱒ョ紪鍐欙纴鍙瑕侀伒寰鐗瑰畾镄勬帴鍙h勮寖銆
8. 鍏变韩瀵硅薄搴撶殑浣跨敤锛孠ylix搴旂敤绋嫔簭浣跨敤SO搴撴椂鍙浠ラ噰鐢ㄤ袱绉嶆柟寮忥纴涓绉嶆槸闅愬纺阈炬帴锛圛mplicit linking锛夛纴涔熺О闱欐佽呭叆锛涘彟涓绉嶆槸鏄惧纺阈炬帴锛圗xplicit Linking锛夛纴涔熺О锷ㄦ佽呭叆銆
9. 浣跨敤鍓岖殑绯荤粺璁剧疆锛岃嚜瀹氢箟SO搴揿缓濂藉悗锛孠ylix搴旂敤绋嫔簭璋幂敤镞朵细鎶ラ敊锛岃繖鏄锲犱负Kylix镓句笉鍒版柊寤哄簱銆傚繀椤诲圭郴缁熻繘琛岀浉鍏宠剧疆锛岃繖涓庡湪Delphi for Windows涓浣跨敤DLL搴扑笉钖屻侱LL搴揿缓濂藉悗鍙闇灏嗙紪璇戝悗镄凞LL鏂囦欢鏀惧埌Delphi涓荤▼搴忕洰褰曚笅鍗冲彲浣跨敤銆
10. 闅愬纺阈炬帴锛屽疄鐜伴殣寮忛摼鎺ュ苟涓嶉毦锛屽彧闇鍦ㄥ簲鐢ㄧ▼搴忎腑锷犲叆搴揿嚱鏁扮殑澹版槑璇鍙ュ强搴撶殑external瀹氢箟浠庡彞锛屽垯搴揿嚱鏁板彲浠ュ拰涓鑸灞閮ㄥ嚱鏁颁竴镙蜂娇鐢ㄣ
11. 鏄惧纺阈炬帴锛屾樉寮忛摼鎺ユ槸搴旂敤绋嫔簭鍦ㄦ墽琛岃繃绋嬩腑鍙镙规嵁瀹为檯闇瑕侀殢镞跺姞杞絊O搴撴枃浠讹纴涔熷彲浠ラ殢镞跺嵏杞絊O搴撴枃浠讹纴杩桦彲鍦ㄨ繍琛屾椂杩涜孲O搴撶殑鍒囨崲锛岃岃繖浜涙槸闅愬纺阈炬帴镞犳硶锅氩埌镄勚备笌闅愬纺阈炬帴鐩告瘆锛屾樉寮忛摼鎺ュ叿链夋洿澶х殑𨱔垫椿镐с
12. 鍦↘ylix涓锛岃佸姩镐佽呭叆搴揿拰璋幂敤瀵煎嚭鍑芥暟鍙浠ョ敤Delphi浠跨湡浠g爜鎴栬嚜铹禠inux鏂规硶锛屼笅闱㈠垎鍒浠嬬粛杩欎袱绉嶆柟娉曘
13. SO搴扑腑绐椾綋瀵硅薄镄勪娇鐢锛岄櫎浜嗗寘钖鍑芥暟鍜岃繃绋嬬殑搴扑箣澶栵纴杩桦彲浠ュ皢Kylix寤虹珛镄勭獥浣撴斁鍦ㄥ叡浜瀵硅薄涓锛岃繖鍙浠ユ槸瀵硅瘽妗嗘垨鍏朵粬绐椾綋銆
⑶ GCC濡备綍鍙瀵煎嚭鎸囧畾镄勭殑鍑芥暟
涓岖敤鐗瑰畾镄勬墿灞曞悕锛屼笖涓嶆槸鍦 gcc 涓鎸囧畾鍙傛暟锛岃屾槸鍦 ld 涓銆傚啓涓涓瀵煎嚭绗﹀彿鏂囦欢锛屽 symbol 鎸囧畾浣犲彧瀵煎嚭镄勫嚱鏁帮纴濡 func1銆备娇鐢 ld 镄--retain-symbols-file 鍙傛暟鍙浠ュ湪 static section 閲屽彇娑 func1 浠ュ栫殑镓链夊嚱鏁般傝繖镞朵綘鐢 readelf 鐪嬬紪璇戝ソ钖庣殑 銆俿o 鏂囦欢 static section 閲屾病链変简锛屼娇鐢 nm 鐪嬨俿o鏂囦欢瀹冩棤娉曟煡鍑哄煎嚭鍑芥暟銆备絾杩椤苟涓嶅畬鍏ㄣ傚洜涓哄湪 dynamic section 閲岃缮鏄浼氱湅鍒版墍链夌﹀彿琚瀵煎嚭銆傚傛灉𨱍冲湪 銆俤ynsym 杩欎釜 section 閲屼篃涓嶈╀粬瀵煎嚭镄勮瘽锛岄渶瑕佸啀缂栧啓涓涓 script 鏂囦欢銆 鎸囧畾 global 涓 local 鍦 global 涓鎸囧畾浣犺佸煎嚭镄勫嚱鏁帮纴绠鍗旷殑镙煎纺濡备笅锛殁global: 瀵煎嚭鍑芥暟钖;local: *;};鍐嶅湪ld 镞剁敤 --version-script 阃夐”𨱒 load 浣 鏂囦欢銆傞兘瀹屼簨钖庡啀浣跨敤 readelf 瑙傚疗static 涓 dynamic section 鍙戠幇鍙瀵煎嚭浜嗕綘鎸囧畾镄勫嚱鏁板悕鍗崇﹀彿銆 渚嬶细ld -shared --retain-symbols-file 绗﹀彿鏂囦欢 --version-script 鑴氭湰鏂囦欢 -o 锷ㄦ佸簱鏂囦欢銆俿o filename銆俹
⑷ linux 怎么调用内核导出的函数
Linux内核没有导出的函数不能调用,即使包含了头文件,也会出现符号未定义的警告,并在加载模块时失败。
以下是我的测试例子:
#include <linux/mole.h>
#include <linux/syscalls.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Linmiaohe");
MODULE_DESCRIPTION("try to evole sys_umount");
extern asmlinkage long sys_umount(char __user *name, int flags);
static int __init sys_umount_init(void)
{
sys_umount("./proc",0);
return 0;
}
static void __exit sys_umount_exit(void)
{
printk(KERN_INFO "***********sys_umount mole has been unregistered*************\n");
}
mole_init(sys_umount_init);
mole_exit(sys_umount_exit);