Changeset 14680


Ignore:
Timestamp:
Mar 18, 2011, 2:25:24 PM (9 years ago)
Author:
gb
Message:

Just use the FFI to find sections in core files. Ignore sections
that aren't actually allocated in memory.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/library/core-files.lisp

    r13676 r14680  
    164164  pathname)
    165165
     166#-run-external-program-to-find-sections
     167(defun sections-from-elf-file (pathname)
     168  (let* ((fd (fd-open (native-translated-namestring pathname) #$O_RDONLY)))
     169    (if (< fd 0)
     170      (signal-file-error fd pathname)
     171      (let* ((size (fd-size fd))
     172             (map (#_mmap +null-ptr+ size #$PROT_READ #$MAP_PRIVATE fd 0)))
     173        (if (eql map #$MAP_FAILED)
     174          (progn
     175            (fd-close fd)
     176            (error "Can't memory map file ~a." pathname))
     177          (unwind-protect
     178               (progn
     179                 (unless (and (eql (%get-unsigned-byte map 0) #x7f)
     180                              (eql (%get-unsigned-byte map 1) (char-code #\E))
     181                              (eql (%get-unsigned-byte map 2) (char-code #\L))
     182                              (eql (%get-unsigned-byte map 3) (char-code #\F))
     183                              (eql (pref map
     184                                         #+64-bit-host #>Elf64_Ehdr.e_type
     185                                         #-64-bit-host #>Elf32_Ehdr.e_type)
     186                                   #$ET_CORE))
     187                   (error "Not an ELF core file: ~a." pathname))
     188                 (let* ((nsects (pref map
     189                                      #+64-bit-host #>Elf64_Ehdr.e_shnum
     190                                      #-64-bit-host #>Elf32_Ehdr.e_shnum))
     191                        (sectptr (%inc-ptr map
     192                                           (pref map
     193                                                 #+64-bit-host #>Elf64_Ehdr.e_shoff
     194                                                 #-64-bit-host #>Elf32_Ehdr.e_shoff)))
     195                        (core-sections ()))
     196                   (dotimes (i nsects (sort (coerce core-sections 'vector)
     197                                            #'<
     198                                            :key (lambda (x) (%core-sect.start-addr x))))
     199                     (when (logtest #$SHF_ALLOC (pref sectptr
     200                                                      #+64-bit-host #>Elf64_Shdr.sh_flags
     201                                                      #-64-bit-host #>Elf32_Shdr.sh_flags))
     202                       (let* ((start (pref sectptr
     203                                           #+64-bit-host #>Elf64_Shdr.sh_addr
     204                                           #-64-bit-host #>Elf32_Shdr.sh_addr))
     205                              (end (+ start (pref sectptr
     206                                           #+64-bit-host #>Elf64_Shdr.sh_size
     207                                           #-64-bit-host #>Elf32_Shdr.sh_size)))
     208                              (offset (pref sectptr
     209                                           #+64-bit-host #>Elf64_Shdr.sh_offset
     210                                           #-64-bit-host #>Elf32_Shdr.sh_offset)))
     211                         (push (make-core-sect :start start :end end :offset offset)
     212                               core-sections)))
     213                     (%incf-ptr sectptr (record-length #+64-bit-host #>Elf64_Shdr
     214                                                       #-64-bit-host #>Elf32_Shdr)))))
     215            (#_munmap map size)
     216            (fd-close fd)))))))
     217                                             
     218                       
     219                       
     220                   
     221   
     222   
    166223;; Kinda stupid to call external program for this...
    167224(defun read-sections (pathname)
     225  #-run-external-program-to-find-sections (sections-from-elf-file pathname)
     226  #+run-external-program-to-find-sections
    168227  (flet ((split (line start end)
    169228           (loop while (setq start (position-if-not #'whitespacep line :start start :end end))
Note: See TracChangeset for help on using the changeset viewer.