代码之家  ›  专栏  ›  技术社区  ›  Magnus

按需装卸ELF段?

  •  3
  • Magnus  · 技术社区  · 16 年前

    对于一个相当模糊的用例,我希望有一个(大的)静态链接的Linux可执行文件,由一小段控制代码和大量静态(只读)数据组成。为了节省内存,是否可以让加载器仅加载控制代码的部分,然后根据需要手动加载RO数据的部分,并在处理完成后再次卸载?

    这可能吗?

    (我想可以使用数据流(在文件系统级别)来解决这个问题,但它们对我来说不可用(EXT3),而且由于数据流很容易丢失,所以分发会很棘手。)

    4 回复  |  直到 16 年前
        1
  •  4
  •   Idelic    16 年前

    这(很可能)已经为您处理好了。

    当然,真正的答案取决于系统,但一般来说,现代操作系统(当然还有Linux)对可执行文件使用按需分页,因此实际上不会为您不引用的ELF文件部分分配RAM。

        2
  •  1
  •   Alexey Feldgendler    16 年前

    与其将blob链接到二进制文件中,不如将它们附加到二进制文件中。它们不会被映射,但您可以根据需要读取或映射它们。

        3
  •  1
  •   asdf    15 年前

    有些答案有些误导,因为它们暗示整个二进制将被映射。不,那是错的。不是所有的东西都会被映射!

    证明:

    $ cat /proc/self/maps
    **08048000**-08052000 r-xp 00000000 08:03 78433      /bin/cat
    **08052000**-08053000 rw-p 0000a000 08:03 78433      /bin/cat
    ...
    

    这是地图中仅有的两个部分。为什么?因为这些是唯一具有DT_荷载类型的:

    $ readelf -l /bin/cat
    
    Elf file type is EXEC (Executable file)
    Entry point 0x8049cf8
    There are 8 program headers, starting at offset 52
    
    Program Headers:
      Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
      PHDR           0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
      INTERP         0x000134 0x08048134 0x08048134 0x00013 0x00013 R   0x1
          [Requesting program interpreter: /lib/ld-linux.so.2]
      LOAD           0x000000 **0x08048000** 0x08048000 0x09ba0 0x09ba0 R E 0x1000  <<
      LOAD           0x00a000 **0x08052000** 0x08052000 0x00228 0x00804 RW  0x1000  <<
      DYNAMIC        0x00a014 0x08052014 0x08052014 0x000c8 0x000c8 RW  0x4
      NOTE           0x000148 0x08048148 0x08048148 0x00044 0x00044 R   0x4
      GNU_EH_FRAME   0x008c48 0x08050c48 0x08050c48 0x002a4 0x002a4 R   0x4
      GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4
    

    您还将注意到,虚拟地址与ELF文件中定义的相同。

    如果希望访问所有ELF部分,最简单的方法是映射整个文件。

        4
  •  0
  •   Daniel Goldberg    16 年前

    不,如果它是ELF文件的一部分,它将被映射。我不确定ELF的细节,但如果这是一个PE文件,您可以简单地将添加的数据标记到PE文件的末尾,超出PE结构。不属于PE结构的数据不会映射到windows中的内存。我怀疑ELF中也存在同样的情况。