Browse Source

Use the entry point address from the ELF header instead of looking up _start.

I love these kind of dumb gotcha moments. Turns out you can find the entry
address right there in the header. :^)
Andreas Kling 6 years ago
parent
commit
46ce47a984
3 changed files with 5 additions and 2 deletions
  1. 2 0
      Kernel/ELFImage.h
  2. 1 0
      Kernel/ELFLoader.h
  3. 2 2
      Kernel/Process.cpp

+ 2 - 0
Kernel/ELFImage.h

@@ -155,6 +155,8 @@ public:
     bool is_executable() const { return header().e_type == ET_EXEC; }
     bool is_relocatable() const { return header().e_type == ET_REL; }
 
+    LinearAddress entry() const { return LinearAddress(header().e_entry); }
+
 private:
     bool parseHeader();
     const char* raw_data(unsigned offset) const;

+ 1 - 0
Kernel/ELFLoader.h

@@ -17,6 +17,7 @@ public:
     char* symbol_ptr(const char* name);
     bool allocate_section(LinearAddress, size_t, size_t alignment, bool is_readable, bool is_writable);
     bool map_section(LinearAddress, size_t, size_t alignment, size_t offset_in_image, bool is_readable, bool is_writable);
+    LinearAddress entry() const { return m_image.entry(); }
 
 private:
     bool layout();

+ 2 - 2
Kernel/Process.cpp

@@ -344,7 +344,7 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
             return -ENOEXEC;
         }
 
-        entry_eip = (dword)loader.symbol_ptr("_start");
+        entry_eip = loader.entry().get();
         if (!entry_eip) {
             m_page_directory = old_page_directory;
             MM.enter_process_paging_scope(*this);
@@ -606,7 +606,7 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
             if (!fork_parent->m_fds[i].descriptor)
                 continue;
 #ifdef FORK_DEBUG
-            dbgprintf("fork: cloning fd %u... (%p) istty? %u\n", i, fork_parent->m_fds[i].ptr(), fork_parent->m_fds[i]->isTTY());
+            dbgprintf("fork: cloning fd %u... (%p) istty? %u\n", i, fork_parent->m_fds[i].descriptor.ptr(), fork_parent->m_fds[i].descriptor->is_tty());
 #endif
             m_fds[i].descriptor = fork_parent->m_fds[i].descriptor->clone();
             m_fds[i].flags = fork_parent->m_fds[i].flags;