VPN ಸ್ಥಾಪಕವು 32-ಬಿಟ್ ಹೇಳುತ್ತದೆ: ಬದಲಾಗಿ ELF ಹೆಡರ್ ಪರಿಶೀಲಿಸಿ
ಪದದ ಗಾತ್ರವು ಸೂಚನಾ ಗುಂಪನ್ನು ಗುರುತಿಸುವುದಿಲ್ಲ. ವರ್ಗ, ಯಂತ್ರ ಮತ್ತು ಇಂಟರ್ಪ್ರಿಟರ್ ಓದಿ, ನಂತರ ಆತಿಥೇಯಕ್ಕೆ ಹೊಂದುವ build ಕೇಳುವ ಕ್ರಮ.
ಒಂದು ಡೌನ್ಲೋಡ್ ಪುಟ 32-ಬಿಟ್ ಎನ್ನುತ್ತದೆ, ಫೈಲ್ Raspberry Pi ಮೇಲೆ ಇಳಿಯುತ್ತದೆ, ಮತ್ತು ಸ್ಥಾಪಕವು ಸಮಸ್ಯೆಯ ಯಾವುದೇ ಉಪಯುಕ್ತ ಭಾಗವನ್ನು ಹೆಸರಿಸದ ಸಂದೇಶದೊಂದಿಗೆ ವಿಫಲವಾಗುತ್ತದೆ. ಎರಡು ಸಂಪೂರ್ಣವಾಗಿ ವಿಭಿನ್ನ ಕಾರ್ಯನಿರ್ವಹಣೀಯ ಫೈಲ್ಗಳು ELF ಅರ್ಥದಲ್ಲಿ ಎರಡೂ 32-ಬಿಟ್ ಎಂದು ಪರಿಗಣಿಸಲ್ಪಡುತ್ತವೆ, ಮತ್ತು ಅವುಗಳಲ್ಲಿ ಒಂದೇ ಆ ಬೋರ್ಡ್ನಲ್ಲಿ ಚಲಿಸಬಲ್ಲದು. ವರ್ಗ ಕ್ಷೇತ್ರವು ಒಂದು ಸತ್ಯ, ಯಂತ್ರ ಕ್ಷೇತ್ರವು ಇನ್ನೊಂದು, ಮತ್ತು ಫೈಲ್ ಹೆಸರು ನಿಮಗೆ ಎರಡನ್ನೂ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿ ಹೇಳುವುದಿಲ್ಲ. ಗ್ರಂಥಾಲಯವನ್ನು ಬದಲಿಸುವ ಅಥವಾ ಇನ್ನೊಂದು ಕನ್ನಡಿಯನ್ನು ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು ಹೆಡರ್ ಓದಿ.
ವರ್ಗವು ಪದದ ಗಾತ್ರವನ್ನು ಹೇಳುತ್ತದೆ, ಯಂತ್ರವು ಸೂಚನಾ ಗುಂಪನ್ನು
Linux ELF ಉಲ್ಲೇಖ ಫೈಲ್ ಹೆಡರ್ನಲ್ಲಿ ವರ್ಗ ಕ್ಷೇತ್ರ ಮತ್ತು ಯಂತ್ರ ಕ್ಷೇತ್ರವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ, ಮತ್ತು ಎರಡೂ ಬೇರೆ ಬೇರೆ ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸುತ್ತವೆ. ವರ್ಗವು ಫೈಲ್ 32-ಬಿಟ್ ಅಥವಾ 64-ಬಿಟ್ ರೂಪವನ್ನು ಬಳಸುತ್ತದೆಯೇ ಎಂದು ಹೇಳುತ್ತದೆ; ಯಂತ್ರವು ಅದು ಯಾವ ಸೂಚನಾ ಗುಂಪಿಗಾಗಿ ನಿರ್ಮಿಸಲ್ಪಟ್ಟಿದೆ ಎಂದು ಹೇಳುತ್ತದೆ. 32-ಬಿಟ್ x86 build ಮತ್ತು 32-ಬಿಟ್ ARM build ಮೊದಲನೆಯದರಲ್ಲಿ ಒಪ್ಪುತ್ತವೆ ಮತ್ತು ಎರಡನೆಯದರಲ್ಲಿ ಭಿನ್ನವಾಗುತ್ತವೆ. ಹೀಗೆ ಸರಿಯಾದ ಪದದ ಗಾತ್ರವನ್ನು ಭರವಸೆ ನೀಡುವ ಲೇಬಲ್ ಕೂಡ ಪ್ರೊಸೆಸರ್ ಡೀಕೋಡ್ ಮಾಡಲಾಗದ ಕೋಡ್ ಅನ್ನು ನೀಡುತ್ತದೆ. ಓದಲು ಯೋಗ್ಯವಾದ ಮೂರನೆಯ ಮೌಲ್ಯವು ಕೇಳಲಾದ ಇಂಟರ್ಪ್ರಿಟರ್, ಅದನ್ನು ಪ್ರೋಗ್ರಾಂ ಹೆಡರ್ಗಳು ಬೈನರಿ ಒಂದನ್ನು ಘೋಷಿಸಿದಾಗ ಹೆಸರಿಸುತ್ತವೆ.
readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED
ಮೊದಲ ಆಜ್ಞೆ ಹೆಡರ್ ಅನ್ನು ಮುದ್ರಿಸುತ್ತದೆ, ಎರಡನೆಯದು ಫೈಲ್ನಲ್ಲಿ ಇದ್ದರೆ ಪ್ರೋಗ್ರಾಂ ಹೆಡರ್ಗಳನ್ನು ಮುದ್ರಿಸುತ್ತದೆ, ಮತ್ತು ಮೂರನೆಯದು ಲೋಡರ್ಗೆ ಬೇಕಾಗುವ ಹಂಚಿಕೆಯ ವಸ್ತುಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡುತ್ತದೆ. ವರ್ಗ, ಯಂತ್ರ ಮತ್ತು ಇಂಟರ್ಪ್ರಿಟರ್ ಅನ್ನು ಒಟ್ಟಿಗೆ ದಾಖಲಿಸಿ, ಏಕೆಂದರೆ ಈ ಮೂರು ಮೌಲ್ಯಗಳೇ ಈ ಪದರದಲ್ಲಿನ ಸಂಪೂರ್ಣ ಹೊಂದಾಣಿಕೆಯ ಪ್ರಶ್ನೆ. ಮೂರರಲ್ಲಿ ಯಾವುದೂ ಡೌನ್ಲೋಡ್ ಬಟನ್ನಲ್ಲಿ ಕಾಣುವುದಿಲ್ಲ, ಆದ್ದರಿಂದ ಫೈಲ್ ಅನ್ನು ವಿವರಿಸುವುದಲ್ಲ, ಪರಿಶೀಲಿಸಬೇಕು.
ಅದು ಕರ್ನಲ್ನಿಂದ ಯಾವ ಇಂಟರ್ಪ್ರಿಟರ್ ಕೇಳುತ್ತದೆ
ಇಂಟರ್ಪ್ರಿಟರ್ ಘೋಷಿಸುವ ಕಾರ್ಯನಿರ್ವಹಣೀಯ ಫೈಲ್ ಕರ್ನಲ್ನಿಂದ ಒಂದು ನಿರ್ದಿಷ್ಟ ಲೋಡರ್ ಮಾರ್ಗವನ್ನು ಕೇಳುತ್ತದೆ. ಆ ಲೋಡರ್ ಇಲ್ಲದಿದ್ದಾಗ, ನೀವು ಹೆಸರಿಸಿದ ಫೈಲ್ ನಿಖರವಾಗಿ ಅಲ್ಲಿದ್ದರೂ ಪ್ರಾರಂಭ ವಿಫಲವಾಗುತ್ತದೆ. ಇದೇ ಜನರು ಡೌನ್ಲೋಡ್ ಹಾಳಾಗಿದೆ ಎಂದು ನಿರ್ಧರಿಸುವ ಹಂತ, ಆದರೆ ನಿಜವಾದ ಉತ್ತರ ವಿತರಣೆಯು ಒದಗಿಸದ ಲೋಡರ್.
ಲೋಡರ್ ಅನ್ನು ನೀವು ನಿಜವಾಗಿ ಚಲಾಯಿಸುವ ವ್ಯವಸ್ಥೆಗೆ ಹೊಂದಿಸಿ: OS ಬಿಡುಗಡೆ, ಬಳಕೆದಾರ ಸ್ಥಳದ ಆರ್ಕಿಟೆಕ್ಚರ್ ಮತ್ತು ಲೋಡರ್ ಒದಗಿಸುವ ಪ್ಯಾಕೇಜ್. 64-ಬಿಟ್ ಕರ್ನಲ್ 32-ಬಿಟ್ ಬಳಕೆದಾರ ಸ್ಥಳವನ್ನು ಆ ಸ್ಥಳ ಮತ್ತು ಅದರ ಲೋಡರ್ ಸ್ಥಾಪಿತವಾದಾಗ ಮಾತ್ರ ಚಲಾಯಿಸಬಲ್ಲದು, ಆದ್ದರಿಂದ ಪ್ರೊಸೆಸರ್ನ ಸಾಮರ್ಥ್ಯಗಳು ನಿರ್ಣಾಯಕ ಅಂಶವಲ್ಲ. ಒಂದು ಸಣ್ಣ ಪರಿಶೀಲನೆ ಇಂಟರ್ಪ್ರಿಟರ್ ಅನ್ನು ಒಂದೇ ಸಾಲಿನಲ್ಲಿ ಹೆಸರಿಸುತ್ತದೆ, ಮತ್ತು ಅದು ಬೆಂಬಲ ಟಿಕೆಟ್ಗಿಂತ ಕಡಿಮೆ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಶೆಲ್ ಸ್ಕ್ರಿಪ್ಟ್ ಮತ್ತೊಂದು ರೀತಿಯಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ, ಏಕೆಂದರೆ ಅದರ ಇಂಟರ್ಪ್ರಿಟರ್ ELF ಹೆಡರ್ನಲ್ಲಿ ಅಲ್ಲ, ಮೊದಲ ಸಾಲಿನಲ್ಲಿ ಹೆಸರಿಸಲ್ಪಡುತ್ತದೆ, ಮತ್ತು ಆ ಸಾಲನ್ನು ಓದಲು ಏನೂ ಖರ್ಚಾಗುವುದಿಲ್ಲ.
file --brief ./vendor-vpn
ಡೌನ್ಲೋಡ್ ಅನ್ನು ಪ್ಯಾಕೇಜ್ ಆರ್ಕಿಟೆಕ್ಚರ್ಗೆ ಹೊಂದಿಸಿ
ವಿತರಣೆಗಳ ಪ್ಯಾಕೇಜ್ ಆರ್ಕಿಟೆಕ್ಚರ್ಗಳು ಅದೇ ವ್ಯತ್ಯಾಸವನ್ನು ತಮ್ಮದೇ ಪದಕೋಶದಲ್ಲಿ ಸಂಕೇತೀಕರಿಸುತ್ತವೆ, ಮತ್ತು ಮಾರಾಟಗಾರರ ಬೆಂಬಲ ಹೇಳಿಕೆ ಸೂಚಿಸುವುದು ಅದೇ ಪದಕೋಶವನ್ನೇ. ನಿಮ್ಮ ಪ್ಯಾಕೇಜ್ ನಿರ್ವಾಹಕ ವರದಿ ಮಾಡುವ ಮೌಲ್ಯವನ್ನು ಮಾರಾಟಗಾರ ದಾಖಲಿಸುವ ಮೌಲ್ಯದೊಂದಿಗೆ ಹೋಲಿಸಿ, ಮಾರ್ಕೆಟಿಂಗ್ ಲೇಬಲ್ ಅನ್ನು ಫೈಲ್ ಹೆಸರಿನೊಂದಿಗೆ ಹೋಲಿಸುವ ಬದಲು. ತೊಂದರೆ ಉಂಟುಮಾಡುವ ಜೋಡಿಗಳು amd64 ವಿರುದ್ಧ arm64, ಮತ್ತು armhf ವಿರುದ್ಧ armel, ಏಕೆಂದರೆ ಪ್ರತಿ ಜೋಡಿಯೂ ಡೌನ್ಲೋಡ್ ಪಟ್ಟಿಯಲ್ಲಿ ಪರಸ್ಪರ ಬದಲಾಯಿಸಬಹುದಾದಂತೆ ಕಾಣುತ್ತದೆ. x64 ಅಥವಾ ia32 ನಲ್ಲಿ ಕೊನೆಗೊಳ್ಳುವ ಫೈಲ್ ಹೆಸರು build ಗುರಿಯನ್ನು ವಿವರಿಸುತ್ತದೆ, ಅದನ್ನು ಹಿಡಿದಿಟ್ಟುಕೊಂಡಿರುವ ಯಂತ್ರವನ್ನಲ್ಲ.
| Label on the download | ELF class | e_machine | Interpreter the kernel wants | How it fails on the wrong host |
|---|---|---|---|---|
| amd64 | ELF64 | x86-64 | /lib64/ld-linux-x86-64.so.2 | Immediate exec failure on an ARM board |
| armhf | ELF32 | ARM | /lib/ld-linux-armhf.so.3 | Loads on a soft-float system, then fails on a float ABI call |
| i386 | ELF32 | Intel 80386 | /lib/ld-linux.so.2 | Exec format error where no 32-bit loader package exists |
ಪ್ರತಿ ಸಾಲೂ ಪದದ ಗಾತ್ರ ಸರಿಯಾಗಿ ಕಾಣುವ ಮತ್ತು ಕೋಡ್ ಇನ್ನೂ ತಪ್ಪಾಗಿ ವರ್ತಿಸುವ ಪ್ರಕರಣ, ಅಥವಾ ಅದು ಪ್ರಾರಂಭವಾಗಿ ನಂತರ ಒಂದು ಪದರ ಕೆಳಗೆ ವಿಫಲವಾಗುವ ಪ್ರಕರಣ. ಇಂಟರ್ಪ್ರಿಟರ್ ಕಾಲಮ್ ಅನ್ನು ಸೂಚನೆಯಲ್ಲ, ಕಠಿಣ ಅಗತ್ಯವಾಗಿ ಓದಿ, ಏಕೆಂದರೆ ಕರ್ನಲ್ ನಿಮ್ಮ ಕೋಡ್ನ ಯಾವುದೇ ಭಾಗ ಚಲಿಸುವ ಮೊದಲೇ ಆ ಮಾರ್ಗವನ್ನು ಬಿಡಿಸುತ್ತದೆ. ಎಮ್ಯುಲೇಶನ್ ತನ್ನದೇ ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಬೆಂಬಲ ಪರಿಣಾಮಗಳಿರುವ ನಿಯೋಜನಾ ನಿರ್ಧಾರ, ಮತ್ತು ಅಗಲವಾದ ಪದದ ಗಾತ್ರವನ್ನು ಜಾಹೀರಾತು ಮಾಡುವ ಪ್ರೊಸೆಸರ್ ಅದನ್ನು ಎಂದಿಗೂ ಸೂಚಿಸುವುದಿಲ್ಲ.
dpkg --print-architecture
ENOEXEC ಮತ್ತು ENOENT ವಿಭಿನ್ನ ವೈಫಲ್ಯಗಳು
ಪ್ರಾರಂಭ ಹಂತವು ಎರಡು ದೋಷಗಳಲ್ಲಿ ಒಂದನ್ನು ವರದಿ ಮಾಡುತ್ತದೆ, ಮತ್ತು ಅವು ಬೇರೆ ಬೇರೆ ಸಮಸ್ಯೆಗಳನ್ನು ಸೂಚಿಸುತ್ತವೆ. ದೋಷದ ಮೌಲ್ಯವನ್ನು ಓದುವುದು ಬೇರೆ ಏನನ್ನಾದರೂ ಚಲಾಯಿಸುವ ಮೊದಲು ವೈಫಲ್ಯವನ್ನು ವರ್ಗೀಕರಿಸುತ್ತದೆ.
ENOEXEC ಎಂದರೆ ಸ್ವರೂಪವು ಗುರುತಿಸಲ್ಪಟ್ಟಿಲ್ಲ: ತಪ್ಪಾದ ಆರ್ಕಿಟೆಕ್ಚರ್, ತಪ್ಪಾದ ವರ್ಗ ಅಥವಾ ಸಂಪೂರ್ಣವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಣೀಯ ಫೈಲ್ ಅಲ್ಲದ ಯಾವುದೋ ಒಂದು. ELF ಫೈಲ್ನಲ್ಲಿ ENOENT ಸಾಮಾನ್ಯವಾಗಿ ಇಂಟರ್ಪ್ರಿಟರ್ ಇಲ್ಲ ಎಂದು ಅರ್ಥ, ನೀವು ಕೇಳಿದ ಫೈಲ್ ಇದ್ದರೂ. ಅದೇ ENOENT ಸ್ಕ್ರಿಪ್ಟ್ನ ಇಂಟರ್ಪ್ರಿಟರ್ ಇಲ್ಲ ಎಂದೂ ಅರ್ಥವಾಗಬಹುದು, ಆದ್ದರಿಂದ ಸ್ಕ್ರಿಪ್ಟ್ನ ಮೊದಲ ಸಾಲು ಮುಖ್ಯ. ಹೇಗಾದರೂ ಸಂದೇಶವು ಪದರವನ್ನು ಹೆಸರಿಸುತ್ತದೆ, ಮತ್ತು ಪ್ರತಿ “ಸಿಗಲಿಲ್ಲ” ಎಂಬುದನ್ನು ಕಾಣೆಯಾದ ಸಂರಚನೆ ಎಂದು ಪರಿಗಣಿಸುವುದು ತನಿಖೆಯನ್ನು ತಪ್ಪು ದಿಕ್ಕಿಗೆ ಕಳುಹಿಸುತ್ತದೆ. ಟಿಕೆಟ್ನಲ್ಲಿ ದೋಷದ ಮೌಲ್ಯವನ್ನು ಉಲ್ಲೇಖಿಸಿ, ಏಕೆಂದರೆ ಅದು ಸುತ್ತಲಿನ ವಾಕ್ಯಕ್ಕಿಂತ ಮರುಕಥನವನ್ನು ಚೆನ್ನಾಗಿ ತಾಳುತ್ತದೆ.
ಬೈನರಿ ಪ್ರಾರಂಭವಾಗದಿದ್ದಾಗ ಏನು ಮಾಡಬಾರದು
ವಿವರಿಸಲಾಗದ ಬೈನರಿಯನ್ನು ಶೆಲ್ ಹೊದಿಕೆಯ ಮೂಲಕ ಒತ್ತಾಯಿಸಿ ಹಾಯಿಸುವುದು ಅದನ್ನು ಚಲಾಯಿಸುವುದಿಲ್ಲ. ನೀವು ನಂಬದ ಫೈಲ್ನಲ್ಲಿ ಅವಲಂಬನೆ ಪರಿಶೀಲಕವನ್ನು ಎಚ್ಚರಿಕೆಯಿಲ್ಲದೆ ಚಲಾಯಿಸಬೇಡಿ, ಏಕೆಂದರೆ ಅದನ್ನು ಚಲಾಯಿಸುವುದು ಕೆಲವು ಸಂದರ್ಭಗಳಲ್ಲಿ ಬೈನರಿಯಿಂದ ಕೋಡ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದು. ಲೋಡರ್ ಸಿಂಬಾಲಿಕ್ ಲಿಂಕ್ಗಳನ್ನು ಸೇರಿಸಬೇಡಿ, ಹೋಸ್ಟ್ ಗ್ರಂಥಾಲಯಗಳನ್ನು ಬದಲಿಸಬೇಡಿ ಮತ್ತು ಸಂದೇಶವನ್ನು ದಾಟಲು ತೃತೀಯ ಪಕ್ಷದ ಕನ್ನಡಿಯಿಂದ ಹಳೆಯ ಆರ್ಕೈವ್ ತರಬೇಡಿ. ಇವುಗಳಲ್ಲಿ ಪ್ರತಿಯೊಂದೂ ಹೆಡರ್ ಈಗಾಗಲೇ ಹೆಸರಿಸಿರುವ ಅಸಂಗತಿಯನ್ನು ಮುಟ್ಟದೆ ಬದಲಾವಣೆಯ ವ್ಯಾಪ್ತಿಯನ್ನು ವಿಸ್ತರಿಸುತ್ತದೆ.
ಮಾರಾಟಗಾರರನ್ನು ಸಂಪರ್ಕಿಸುವಾಗ ಕಥೆಯಲ್ಲ, ಮೌಲ್ಯಗಳನ್ನು ಕಳುಹಿಸಿ: OS ಬಿಡುಗಡೆ, ಪ್ಯಾಕೇಜ್ ಆರ್ಕಿಟೆಕ್ಚರ್, ವರ್ಗ ಮತ್ತು ಯಂತ್ರ ಸ್ಟ್ರಿಂಗ್ಗಳು, ಕೇಳಲಾದ ಇಂಟರ್ಪ್ರಿಟರ್ ಮತ್ತು ಮೊದಲ ದೋಷ ಸಾಲು. ಆ ಗುಂಪು ಬೆಂಬಲ ಪ್ರಶ್ನೆಗಳನ್ನು ವಿಫಲ ಸ್ಥಾಪಕದ ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಿಂತ ವೇಗವಾಗಿ ಬಿಡಿಸುತ್ತದೆ. ಹಳೆಯ ಕಲಾಕೃತಿಗಳು ಮತ್ತು ನೆನಪಿನಲ್ಲಿರುವ ಫೋರಂ ಔಟ್ಪುಟ್ಗಳು ಪ್ರಸ್ತುತ ಬೆಂಬಲ ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಅಲ್ಲ, ಮತ್ತು ಸ್ಥಳೀಯ ಬೈನರಿ ಲೋಡ್ ಆದ ನಂತರ ಪ್ರೊಫೈಲ್, ದೃಢೀಕರಣ ಮತ್ತು ರೂಟಿಂಗ್ ಪ್ರತ್ಯೇಕ ಕೆಲಸವಾಗಿ ಉಳಿಯುತ್ತವೆ.