免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4685 | 回复: 7
打印 上一主题 下一主题

convert .so to .a? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-08 18:05 |只看该作者 |倒序浏览
.a 是.o的打包。.a 可以dump出.o

.so是link过的.o,

.so 可以转成.a么,或者dump出来.o?
用gcc或者其他工具?

谢谢

论坛徽章:
0
2 [报告]
发表于 2010-06-08 18:07 |只看该作者
windows上dll可以用工具转出lib的

论坛徽章:
0
3 [报告]
发表于 2010-06-08 18:13 |只看该作者
静态编译就相当于把so 里的o当成a用了把。。。

论坛徽章:
0
4 [报告]
发表于 2010-06-08 18:16 |只看该作者
其实问题的实质,应该是link后,so是否还能dump出.o来

论坛徽章:
0
5 [报告]
发表于 2010-06-08 19:09 |只看该作者
由于.so是-fPIC编译生成的,可以安放在内存的任何位置都能执行(要求对齐)。所以理论上完全可以把.so文件转成数组编译进执行文件,执行文件运行起来后为其分配一块内存并将.so文件内容复制到该内存中。应该还有些衔接符号工作吧,需要参考一下Kernel的源代码看是怎么弄的,应该不难。

论坛徽章:
0
6 [报告]
发表于 2010-06-08 19:20 |只看该作者
好像很难弄吧

论坛徽章:
0
7 [报告]
发表于 2010-06-08 20:00 |只看该作者
看了下kernel 2.6.33的源程序,应该是/usr/src/linux/fs/binfmt_elf.c这个文件。

  1. /* This is really simpleminded and specialized - we are loading an
  2.     a.out library that is given an ELF header. */
  3. static int load_elf_library(struct file *file)
  4. {
  5.          struct elf_phdr *elf_phdata;
  6.          struct elf_phdr *eppnt;
  7.          unsigned long elf_bss, bss, len;
  8.          int retval, error, i, j;
  9.          struct elfhdr elf_ex;

  10.          error = -ENOEXEC;
  11.          retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
  12.          if (retval != sizeof(elf_ex))
  13.                  goto out;

  14.          if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
  15.                  goto out;

  16.          /* First of all, some simple consistency checks */
  17.          if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
  18.              !elf_check_arch(&elf_ex) || !file->f_op || !file->f_op->mmap)
  19.                  goto out;

  20.          /* Now read in all of the header information */

  21.          j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
  22.          /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */

  23.          error = -ENOMEM;
  24.          elf_phdata = kmalloc(j, GFP_KERNEL);
  25.          if (!elf_phdata)
  26.                  goto out;

  27.          eppnt = elf_phdata;
  28.          error = -ENOEXEC;
  29.          retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
  30.          if (retval != j)
  31.                  goto out_free_ph;

  32.          for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
  33.                  if ((eppnt + i)->p_type == PT_LOAD)
  34.                          j++;
  35.          if (j != 1)
  36.                  goto out_free_ph;

  37.          while (eppnt->p_type != PT_LOAD)
  38.                  eppnt++;

  39.          /* Now use mmap to map the library into memory. */
  40.          down_write(&current->mm->mmap_sem);
  41.          error = do_mmap(file,
  42.                          ELF_PAGESTART(eppnt->p_vaddr),
  43.                          (eppnt->p_filesz +
  44.                           ELF_PAGEOFFSET(eppnt->p_vaddr)),
  45.                          PROT_READ | PROT_WRITE | PROT_EXEC,
  46.                          MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
  47.                          (eppnt->p_offset -
  48.                           ELF_PAGEOFFSET(eppnt->p_vaddr)));
  49.          up_write(&current->mm->mmap_sem);
  50.          if (error != ELF_PAGESTART(eppnt->p_vaddr))
  51.                  goto out_free_ph;

  52.          elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
  53.          if (padzero(elf_bss)) {
  54.                  error = -EFAULT;
  55.                  goto out_free_ph;
  56.          }

  57.          len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
  58.                              ELF_MIN_ALIGN - 1);
  59.          bss = eppnt->p_memsz + eppnt->p_vaddr;
  60.          if (bss > len) {
  61.                  down_write(&current->mm->mmap_sem);
  62.                  do_brk(len, bss - len);
  63.                  up_write(&current->mm->mmap_sem);
  64.          }
  65.          error = 0;

  66. out_free_ph:
  67.          kfree(elf_phdata);
  68. out:
  69.          return error;
  70. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-06-09 08:38 |只看该作者
应该能弄,但不好弄
学习下LS的源码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP