21 CurrentDirectory LastTimeInfo LastTimeInfoSeconds |
19 CurrentDirectory LastTimeInfo LastTimeInfoSeconds |
22 LastTimeInfoMilliseconds LastTimeInfoIsLocal CachedMountPoints |
20 LastTimeInfoMilliseconds LastTimeInfoIsLocal CachedMountPoints |
23 CacheMountPointsTimeStamp Codeset CodesetEncoder' |
21 CacheMountPointsTimeStamp Codeset CodesetEncoder' |
24 poolDictionaries:'' |
22 poolDictionaries:'' |
25 category:'OS-Unix' |
23 category:'OS-Unix' |
|
24 ! |
|
25 |
|
26 SharedPool subclass:#ELFConstants |
|
27 instanceVariableNames:'' |
|
28 classVariableNames:'EI_MAG0 ELFMAG0 EI_MAG1 ELFMAG1 EI_MAG2 ELFMAG2 EI_MAG3 ELFMAG3 |
|
29 EI_CLASS ELFCLASSNONE ELFCLASS32 ELFCLASS64 ELFCLASSNUM EI_DATA |
|
30 ELFDATANONE ELFDATA2LSB ELFDATA2MSB ELFDATANUM EI_VERSION |
|
31 EI_OSABI ELFOSABI_NONE ELFOSABI_SYSV ELFOSABI_HPUX |
|
32 ELFOSABI_NETBSD ELFOSABI_GNU ELFOSABI_LINUX ELFOSABI_SOLARIS |
|
33 ELFOSABI_AIX ELFOSABI_IRIX ELFOSABI_FREEBSD ELFOSABI_TRU64 |
|
34 ELFOSABI_MODESTO ELFOSABI_OPENBSD ELFOSABI_ARM_AEABI ELFOSABI_ARM |
|
35 ELFOSABI_STANDALONE EI_ABIVERSION EI_PAD ET_NONE ET_REL ET_EXEC |
|
36 ET_DYN ET_CORE ET_LOOS ET_HIOS ET_LOPROC ET_HIPROC EM_NONE EM_M32 |
|
37 EM_SPARC EM_386 EM_68K EM_88K EM_860 EM_MIPS EM_S370 |
|
38 EM_MIPS_RS3_LE EM_PARISC EM_VPP500 EM_SPARC32PLUS EM_960 EM_PPC |
|
39 EM_PPC64 EM_S390 EM_V800 EM_FR20 EM_RH32 EM_RCE EM_ARM |
|
40 EM_FAKE_ALPHA EM_SH EM_SPARCV9 EM_TRICORE EM_ARC EM_H8_300 |
|
41 EM_H8_300H EM_H8S EM_H8_500 EM_IA_64 EM_MIPS_X EM_COLDFIRE |
|
42 EM_68HC12 EM_MMA EM_PCP EM_NCPU EM_NDR1 EM_STARCORE EM_ME16 |
|
43 EM_ST100 EM_TINYJ EM_X86_64 EM_PDSP EM_FX66 EM_ST9PLUS EM_ST7 |
|
44 EM_68HC16 EM_68HC11 EM_68HC08 EM_68HC05 EM_SVX EM_ST19 EM_VAX |
|
45 EM_CRIS EM_JAVELIN EM_FIREPATH EM_ZSP EM_MMIX EM_HUANY EM_PRISM |
|
46 EM_AVR EM_FR30 EM_D10V EM_D30V EM_V850 EM_M32R EM_MN10300 |
|
47 EM_MN10200 EM_PJ EM_OPENRISC EM_ARC_A5 EM_XTENSA EM_AARCH64 |
|
48 EM_TILEPRO EM_MICROBLAZE EM_TILEGX EM_ALPHA EV_NONE EV_CURRENT' |
|
49 poolDictionaries:'' |
|
50 privateIn:UnixOperatingSystem |
|
51 ! |
|
52 |
|
53 Object subclass:#ELFFileHeader |
|
54 instanceVariableNames:'file data msb' |
|
55 classVariableNames:'' |
|
56 poolDictionaries:'UnixOperatingSystem::ELFConstants' |
|
57 privateIn:UnixOperatingSystem |
26 ! |
58 ! |
27 |
59 |
28 Object subclass:#FileDescriptorHandle |
60 Object subclass:#FileDescriptorHandle |
29 instanceVariableNames:'fd' |
61 instanceVariableNames:'fd' |
30 classVariableNames:'OpenFiles' |
62 classVariableNames:'OpenFiles' |
10903 fd argument not integer or bad return code |
10958 fd argument not integer or bad return code |
10904 " |
10959 " |
10905 ^ self primitiveFailed |
10960 ^ self primitiveFailed |
10906 ! ! |
10961 ! ! |
10907 |
10962 |
|
10963 !UnixOperatingSystem::ELFConstants class methodsFor:'initialization'! |
|
10964 |
|
10965 initialize |
|
10966 "Invoked at system start or when the class is dynamically loaded." |
|
10967 |
|
10968 %{ |
|
10969 #define DEFCONST(c) __GLOBAL_SET(__MKSYMBOL("UnixOperatingSystem::ELFConstants:" #c, (OBJ *)0), __MKSMALLINT(c), (OBJ *)0); |
|
10970 |
|
10971 /* Fields in the e_ident array. The EI_* macros are indices into the |
|
10972 array. The macros under each EI_* macro are the values the byte |
|
10973 may have. */ |
|
10974 |
|
10975 DEFCONST(EI_MAG0) /* File identification byte 0 index */ |
|
10976 DEFCONST(EI_MAG1) /* File identification byte 1 index */ |
|
10977 DEFCONST(EI_MAG2) /* File identification byte 2 index */ |
|
10978 DEFCONST(EI_MAG3) /* File identification byte 3 index */ |
|
10979 |
|
10980 DEFCONST(EI_CLASS) /* File class byte index */ |
|
10981 DEFCONST(ELFCLASSNONE) /* Invalid class */ |
|
10982 DEFCONST(ELFCLASS32) /* 32-bit objects */ |
|
10983 DEFCONST(ELFCLASS64) /* 64-bit objects */ |
|
10984 DEFCONST(ELFCLASSNUM) |
|
10985 |
|
10986 DEFCONST(EI_DATA) /* Data encoding byte index */ |
|
10987 DEFCONST(ELFDATANONE) /* Invalid data encoding */ |
|
10988 DEFCONST(ELFDATA2LSB) /* 2's complement, little endian */ |
|
10989 DEFCONST(ELFDATA2MSB) /* 2's complement, big endian */ |
|
10990 DEFCONST(ELFDATANUM) |
|
10991 |
|
10992 DEFCONST(EI_VERSION) /* File version byte index */ |
|
10993 /* Value must be EV_CURRENT */ |
|
10994 |
|
10995 DEFCONST(EI_OSABI) /* OS ABI identification */ |
|
10996 DEFCONST(ELFOSABI_NONE) /* UNIX System V ABI */ |
|
10997 DEFCONST(ELFOSABI_SYSV) /* Alias. */ |
|
10998 DEFCONST(ELFOSABI_HPUX) /* HP-UX */ |
|
10999 DEFCONST(ELFOSABI_NETBSD) /* NetBSD. */ |
|
11000 DEFCONST(ELFOSABI_GNU) /* Object uses GNU ELF extensions. */ |
|
11001 DEFCONST(ELFOSABI_LINUX) /* Compatibility alias. */ |
|
11002 DEFCONST(ELFOSABI_SOLARIS) /* Sun Solaris. */ |
|
11003 DEFCONST(ELFOSABI_AIX) /* IBM AIX. */ |
|
11004 DEFCONST(ELFOSABI_IRIX) /* SGI Irix. */ |
|
11005 DEFCONST(ELFOSABI_FREEBSD) /* FreeBSD. */ |
|
11006 DEFCONST(ELFOSABI_TRU64) /* Compaq TRU64 UNIX. */ |
|
11007 DEFCONST(ELFOSABI_MODESTO) /* Novell Modesto. */ |
|
11008 DEFCONST(ELFOSABI_OPENBSD) /* OpenBSD. */ |
|
11009 DEFCONST(ELFOSABI_ARM_AEABI)/* ARM EABI */ |
|
11010 DEFCONST(ELFOSABI_ARM) /* ARM */ |
|
11011 DEFCONST(ELFOSABI_STANDALONE)/* Standalone (embedded) application */ |
|
11012 |
|
11013 DEFCONST(EI_ABIVERSION) /* ABI version */ |
|
11014 |
|
11015 DEFCONST(EI_PAD) /* Byte index of padding bytes */ |
|
11016 |
|
11017 /* Legal values for e_type (object file type). */ |
|
11018 |
|
11019 DEFCONST(ET_NONE) /* No file type */ |
|
11020 DEFCONST(ET_REL) /* Relocatable file */ |
|
11021 DEFCONST(ET_EXEC) /* Executable file */ |
|
11022 DEFCONST(ET_DYN) /* Shared object file */ |
|
11023 DEFCONST(ET_CORE) /* Core file */ |
|
11024 |
|
11025 DEFCONST(ET_LOOS) /* OS-specific range start */ |
|
11026 DEFCONST(ET_HIOS) /* OS-specific range end */ |
|
11027 DEFCONST(ET_LOPROC) /* Processor-specific range start */ |
|
11028 DEFCONST(ET_HIPROC) /* Processor-specific range end */ |
|
11029 |
|
11030 /* Legal values for e_machine (architecture). */ |
|
11031 |
|
11032 DEFCONST(EM_NONE) /* No machine */ |
|
11033 DEFCONST(EM_M32) /* AT&T WE 32100 */ |
|
11034 DEFCONST(EM_SPARC) /* SUN SPARC */ |
|
11035 DEFCONST(EM_386) /* Intel 80386 */ |
|
11036 DEFCONST(EM_68K) /* Motorola m68k family */ |
|
11037 DEFCONST(EM_88K) /* Motorola m88k family */ |
|
11038 DEFCONST(EM_860) /* Intel 80860 */ |
|
11039 DEFCONST(EM_MIPS) /* MIPS R3000 big-endian */ |
|
11040 DEFCONST(EM_S370) /* IBM System/370 */ |
|
11041 DEFCONST(EM_MIPS_RS3_LE) /* MIPS R3000 little-endian */ |
|
11042 |
|
11043 DEFCONST(EM_PARISC) /* HPPA */ |
|
11044 DEFCONST(EM_VPP500) /* Fujitsu VPP500 */ |
|
11045 DEFCONST(EM_SPARC32PLUS) /* Sun's "v8plus" */ |
|
11046 DEFCONST(EM_960) /* Intel 80960 */ |
|
11047 DEFCONST(EM_PPC) /* PowerPC */ |
|
11048 DEFCONST(EM_PPC64) /* PowerPC 64-bit */ |
|
11049 DEFCONST(EM_S390) /* IBM S390 */ |
|
11050 |
|
11051 DEFCONST(EM_V800) /* NEC V800 series */ |
|
11052 DEFCONST(EM_FR20) /* Fujitsu FR20 */ |
|
11053 DEFCONST(EM_RH32) /* TRW RH-32 */ |
|
11054 DEFCONST(EM_RCE) /* Motorola RCE */ |
|
11055 DEFCONST(EM_ARM) /* ARM */ |
|
11056 DEFCONST(EM_FAKE_ALPHA) /* Digital Alpha */ |
|
11057 DEFCONST(EM_SH) /* Hitachi SH */ |
|
11058 DEFCONST(EM_SPARCV9) /* SPARC v9 64-bit */ |
|
11059 DEFCONST(EM_TRICORE) /* Siemens Tricore */ |
|
11060 DEFCONST(EM_ARC) /* Argonaut RISC Core */ |
|
11061 DEFCONST(EM_H8_300) /* Hitachi H8/300 */ |
|
11062 DEFCONST(EM_H8_300H) /* Hitachi H8/300H */ |
|
11063 DEFCONST(EM_H8S) /* Hitachi H8S */ |
|
11064 DEFCONST(EM_H8_500) /* Hitachi H8/500 */ |
|
11065 DEFCONST(EM_IA_64) /* Intel Merced */ |
|
11066 DEFCONST(EM_MIPS_X) /* Stanford MIPS-X */ |
|
11067 DEFCONST(EM_COLDFIRE) /* Motorola Coldfire */ |
|
11068 DEFCONST(EM_68HC12) /* Motorola M68HC12 */ |
|
11069 DEFCONST(EM_MMA) /* Fujitsu MMA Multimedia Accelerator*/ |
|
11070 DEFCONST(EM_PCP) /* Siemens PCP */ |
|
11071 DEFCONST(EM_NCPU) /* Sony nCPU embeeded RISC */ |
|
11072 DEFCONST(EM_NDR1) /* Denso NDR1 microprocessor */ |
|
11073 DEFCONST(EM_STARCORE) /* Motorola Start*Core processor */ |
|
11074 DEFCONST(EM_ME16) /* Toyota ME16 processor */ |
|
11075 DEFCONST(EM_ST100) /* STMicroelectronic ST100 processor */ |
|
11076 DEFCONST(EM_TINYJ) /* Advanced Logic Corp. Tinyj emb.fam*/ |
|
11077 DEFCONST(EM_X86_64) /* AMD x86-64 architecture */ |
|
11078 DEFCONST(EM_PDSP) /* Sony DSP Processor */ |
|
11079 |
|
11080 DEFCONST(EM_FX66) /* Siemens FX66 microcontroller */ |
|
11081 DEFCONST(EM_ST9PLUS) /* STMicroelectronics ST9+ 8/16 mc */ |
|
11082 DEFCONST(EM_ST7) /* STmicroelectronics ST7 8 bit mc */ |
|
11083 DEFCONST(EM_68HC16) /* Motorola MC68HC16 microcontroller */ |
|
11084 DEFCONST(EM_68HC11) /* Motorola MC68HC11 microcontroller */ |
|
11085 DEFCONST(EM_68HC08) /* Motorola MC68HC08 microcontroller */ |
|
11086 DEFCONST(EM_68HC05) /* Motorola MC68HC05 microcontroller */ |
|
11087 DEFCONST(EM_SVX) /* Silicon Graphics SVx */ |
|
11088 DEFCONST(EM_ST19) /* STMicroelectronics ST19 8 bit mc */ |
|
11089 DEFCONST(EM_VAX) /* Digital VAX */ |
|
11090 DEFCONST(EM_CRIS) /* Axis Communications 32-bit embedded processor */ |
|
11091 DEFCONST(EM_JAVELIN) /* Infineon Technologies 32-bit embedded processor */ |
|
11092 DEFCONST(EM_FIREPATH) /* Element 14 64-bit DSP Processor */ |
|
11093 DEFCONST(EM_ZSP) /* LSI Logic 16-bit DSP Processor */ |
|
11094 DEFCONST(EM_MMIX) /* Donald Knuth's educational 64-bit processor */ |
|
11095 DEFCONST(EM_HUANY) /* Harvard University machine-independent object files */ |
|
11096 DEFCONST(EM_PRISM) /* SiTera Prism */ |
|
11097 DEFCONST(EM_AVR) /* Atmel AVR 8-bit microcontroller */ |
|
11098 DEFCONST(EM_FR30) /* Fujitsu FR30 */ |
|
11099 DEFCONST(EM_D10V) /* Mitsubishi D10V */ |
|
11100 DEFCONST(EM_D30V) /* Mitsubishi D30V */ |
|
11101 DEFCONST(EM_V850) /* NEC v850 */ |
|
11102 DEFCONST(EM_M32R) /* Mitsubishi M32R */ |
|
11103 DEFCONST(EM_MN10300) /* Matsushita MN10300 */ |
|
11104 DEFCONST(EM_MN10200) /* Matsushita MN10200 */ |
|
11105 DEFCONST(EM_PJ) /* picoJava */ |
|
11106 DEFCONST(EM_OPENRISC) /* OpenRISC 32-bit embedded processor */ |
|
11107 DEFCONST(EM_ARC_A5) /* ARC Cores Tangent-A5 */ |
|
11108 DEFCONST(EM_XTENSA) /* Tensilica Xtensa Architecture */ |
|
11109 DEFCONST(EM_AARCH64) /* ARM AARCH64 */ |
|
11110 DEFCONST(EM_TILEPRO) /* Tilera TILEPro */ |
|
11111 DEFCONST(EM_MICROBLAZE) /* Xilinx MicroBlaze */ |
|
11112 DEFCONST(EM_TILEGX) /* Tilera TILE-Gx */ |
|
11113 |
|
11114 /* If it is necessary to assign new unofficial EM_* values, please |
|
11115 pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the |
|
11116 chances of collision with official or non-GNU unofficial values. */ |
|
11117 |
|
11118 DEFCONST(EM_ALPHA) |
|
11119 |
|
11120 /* Legal values for e_version (version). */ |
|
11121 |
|
11122 DEFCONST(EV_NONE) /* Invalid ELF version */ |
|
11123 DEFCONST(EV_CURRENT) /* Current version */ |
|
11124 |
|
11125 #undef DEFCONST |
|
11126 %}. |
|
11127 ELFMAG0 := 16r7F. |
|
11128 ELFMAG1 := $E codePoint. |
|
11129 ELFMAG2 := $L codePoint. |
|
11130 ELFMAG3 := $F codePoint. |
|
11131 |
|
11132 "Modified (comment): / 16-03-2015 / 15:15:29 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11133 ! ! |
|
11134 |
|
11135 !UnixOperatingSystem::ELFFileHeader class methodsFor:'instance creation'! |
|
11136 |
|
11137 fromFile: aStringOrFilename |
|
11138 ^ self new initializeOnFile: aStringOrFilename |
|
11139 |
|
11140 "Created: / 16-03-2015 / 16:12:28 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11141 ! ! |
|
11142 |
|
11143 !UnixOperatingSystem::ELFFileHeader methodsFor:'accessing'! |
|
11144 |
|
11145 e_ident_class |
|
11146 ^ data at: 1 + EI_CLASS |
|
11147 |
|
11148 "Created: / 17-03-2015 / 20:26:54 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11149 ! |
|
11150 |
|
11151 e_machine |
|
11152 ^ data unsignedShortAt: 1 + 16r12 bigEndian: msb |
|
11153 |
|
11154 "Created: / 16-03-2015 / 16:29:54 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11155 ! ! |
|
11156 |
|
11157 !UnixOperatingSystem::ELFFileHeader methodsFor:'initialization'! |
|
11158 |
|
11159 initializeOnFile: aStringOrFilename |
|
11160 file := aStringOrFilename asFilename. |
|
11161 file exists ifFalse:[ |
|
11162 self error:'Given file does not exist'. |
|
11163 ^ nil |
|
11164 ]. |
|
11165 file isRegularFile ifFalse:[ |
|
11166 self error:'Given file is not a regular file'. |
|
11167 ^ nil |
|
11168 ]. |
|
11169 file readingFileDo:[ :s | |
|
11170 s binary. |
|
11171 data := s next: 16r18. |
|
11172 (data at: 1 + EI_MAG0) ~~ ELFMAG0 ifTrue:[ |
|
11173 self error:'Given file is not a valid ELF file (magic not found)'. |
|
11174 ]. |
|
11175 (data at: 1 + EI_MAG1) ~~ ELFMAG1 ifTrue:[ |
|
11176 self error:'Given file is not a valid ELF file (magic not found)'. |
|
11177 ]. |
|
11178 (data at: 1 + EI_MAG2) ~~ ELFMAG2 ifTrue:[ |
|
11179 self error:'Given file is not a valid ELF file (magic not found)'. |
|
11180 ]. |
|
11181 (data at: 1 + EI_MAG3) ~~ ELFMAG3 ifTrue:[ |
|
11182 self error:'Given file is not a valid ELF file (magic not found)'. |
|
11183 ]. |
|
11184 msb := (data at: 1 + EI_DATA) == ELFDATA2MSB |
|
11185 ]. |
|
11186 |
|
11187 "Created: / 16-03-2015 / 16:13:03 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11188 ! ! |
|
11189 |
|
11190 !UnixOperatingSystem::ELFFileHeader methodsFor:'queries'! |
|
11191 |
|
11192 isFor32BitArchitecture |
|
11193 ^ self e_ident_class == ELFCLASS32 |
|
11194 |
|
11195 "Created: / 17-03-2015 / 20:31:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11196 ! |
|
11197 |
|
11198 isFor64BitArchitecture |
|
11199 ^ self e_ident_class == ELFCLASS64 |
|
11200 |
|
11201 "Created: / 17-03-2015 / 20:31:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
11202 ! ! |
|
11203 |
10908 !UnixOperatingSystem::FileDescriptorHandle class methodsFor:'change & update'! |
11204 !UnixOperatingSystem::FileDescriptorHandle class methodsFor:'change & update'! |
10909 |
11205 |
10910 update:aspect with:argument from:anObject |
11206 update:aspect with:argument from:anObject |
10911 "one of our registered handles has been collected" |
11207 "one of our registered handles has been collected" |
10912 |
11208 |