| 105 | } |
| 106 | |
| 107 | FsOpenNode* ElfLoader::inspectNode(BString currentDirectory, const std::shared_ptr<FsNode>& node, BString& loader, BString& interpreter, std::vector<BString>& interpreterArgs) { |
| 108 | bool isElf = 0; |
| 109 | FsOpenNode* openNode = nullptr; |
| 110 | std::shared_ptr<FsNode> interpreterNode; |
| 111 | std::shared_ptr<FsNode> loaderNode; |
| 112 | |
| 113 | if (node) { |
| 114 | openNode = node->open(K_O_RDONLY); |
| 115 | } |
| 116 | if (openNode) { |
| 117 | interpreter = getInterpreter(openNode, &isElf); |
| 118 | if (isElf) { |
| 119 | loader = interpreter; |
| 120 | interpreter = B(""); |
| 121 | } else if (interpreter.length()) { |
| 122 | interpreter.split(' ', interpreterArgs); |
| 123 | interpreter = interpreterArgs[0]; |
| 124 | interpreterArgs.erase(interpreterArgs.begin()); |
| 125 | } |
| 126 | openNode->close(); |
| 127 | delete openNode; |
| 128 | } |
| 129 | if (!interpreter.length() && !isElf) { |
| 130 | return nullptr; |
| 131 | } |
| 132 | if (interpreter.length()) { |
| 133 | interpreterNode = Fs::getNodeFromLocalPath(currentDirectory, interpreter, true); |
| 134 | if (!interpreterNode) { |
| 135 | kwarn_fmt("Interpreter not found: %s", interpreter.c_str()); |
| 136 | return nullptr; |
| 137 | } |
| 138 | openNode = interpreterNode->open(K_O_RDONLY); |
| 139 | loader = ElfLoader::getInterpreter(openNode, &isElf); |
| 140 | openNode->close(); |
| 141 | delete openNode; |
| 142 | } |
| 143 | if (loader.length()) { |
| 144 | loaderNode = Fs::getNodeFromLocalPath(currentDirectory, loader, true); |
| 145 | if (!loaderNode) { |
| 146 | return nullptr; |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | if (loaderNode) { |
| 151 | return loaderNode->open(K_O_RDONLY); |
| 152 | } else if (interpreterNode) { |
| 153 | return interpreterNode->open(K_O_RDONLY); |
| 154 | } else { |
| 155 | return node->open(K_O_RDONLY); |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | int ElfLoader::getMemSizeOfElf(FsOpenNode* openNode) { |
| 160 | U8 buffer[sizeof(struct k_Elf32_Ehdr)] = { 0 }; |