免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kallytin
打印 上一主题 下一主题

gcc静态库链接 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2010-08-17 13:02 |只看该作者
谢谢你的回复。

已可以运行(jmp main)。

但是现在有了些变化,我想带参数,即 ./a.out 目录/文 ...
kallytin 发表于 2010-08-16 18:13


我建议还是先把基本汇编基础先打好,函数调用进栈压栈的流程弄明白,

这个命令行参数是比较复杂的,有兴趣可以去看看crt的源代码,以及内核里面exec相关的代码

简单来说,内核装载程序的时候,会把环境变量、命令行参数等信息放到一个特定的内存位置,然后以某种方式通知应用程序,
应用程序(crt里面的某些函数)会对这些信息进行处理,填充一些变量(例如environ等),以及其他一些初始化任务,
最后构造堆栈,调用main()函数。

论坛徽章:
0
62 [报告]
发表于 2010-08-17 13:12 |只看该作者
我建议还是先把基本汇编基础先打好,函数调用进栈压栈的流程弄明白,

这个命令行参数是比较复杂的, ...
drangon 发表于 2010-08-17 13:02

从shell传递参数到main,我估计会是有2种方式,寄存器/栈。如果是寄存器,我想知道是对应哪个(我曾尝试 ebx, ecx 等作为 argv的首地址,但都没有猜对)?如果是栈的话,会是偏移多少找到 argv 的首地址(这个偏移我想应该是固定的)?由于手头资料不多,看代码会时间较长,因此想请教一下大家,谢谢。

论坛徽章:
0
63 [报告]
发表于 2010-08-17 19:35 |只看该作者
回复 62# kallytin


..........

论坛徽章:
0
64 [报告]
发表于 2010-08-17 21:56 |只看该作者
回复  kallytin


..........
kallytin 发表于 2010-08-17 19:35



    什么意思。。。。?

论坛徽章:
0
65 [报告]
发表于 2010-08-17 23:20 |只看该作者
回复 60# drangon

  哈哈   谢谢你的提醒   那晚上可能是我忘了把.c文件编译成.o文件了 编译的时候它还是使用之前的.o文件
  好 我换成ld链接

  先把.s文件改成:
call main
movl $1,%eax
movl $0,%ebx
int $0x80
//要是不这样改的话会出段错误
然后下面是ld的链接命令
mylinux@mylinux-laptop:~/asm$ ld -e asmfun -o test -lc test.o asm.o -dynamic-linker /lib/ld-linux.so.2
当然用ld链接就得把入口函数改了  这样就达到LZ的目的了吧

论坛徽章:
0
66 [报告]
发表于 2010-08-17 23:49 |只看该作者
本帖最后由 land5280 于 2010-08-18 20:07 编辑

回复 62# kallytin

  我58楼不是说了吗  

  我再详细点也行
  当程序带参数执行 在进入到asnfun汇编代码的时候  此时的esp指向参数个数 esp+8指向第一个参数地址  esp+12指向第二个参数地址  参数地址都是以(esp+4)递增的  没参数的时候就到环境变量了
Ps: 写错了 误人子弟啊

  我也可以很负责任的说 sell传递给main的参数地址是通过进栈传递的  c中的函数调用也一样  它不会通过寄存器 因为寄存器太少了  
  而linux下汇编中的系统调用的参数就是通过寄存器  参数多的时候也得通过栈

  
  再不懂的话就好好照着61楼的话去做

论坛徽章:
0
67 [报告]
发表于 2010-08-18 01:04 |只看该作者
回复  kallytin

  我58楼不是说了吗  

  我再详细点也行
  当程序带参数执行 在进入到asnfun汇编代 ...
land5280 发表于 2010-08-17 23:49


楼上,我已按照你的方法去试拉,但还是不行阿。详细如下:


----------------------------------------------------
程序: test_en.asm


extern        main
extern        exit


bits 32

[SECTION .data]
addr_argv                dd        0
addr_argc                dd        0               

[SECTION .bss]


[section .text]       

global         _start       
global        addr_argv
global        addr_argc


_start:
        ;argc
        mov        eax, dword[esp+4]
        mov        dword[addr_argc], eax

        ;argv
        mov        eax, dword[esp+8]
        mov        dword[addr_argv], eax

        call        main
       
        ;call        exit

----------------------------------------------------


----------------------------------------------------
程序: test.c

#include <stdio.h>

extern int addr_argv;
extern int addr_argc;

int main(int argc, char *argv[])
{
        char *p         = (char*)*(int*)addr_argv; // &argv[0]
        int c                = *(int*)addr_argc;        // argc

        //printf("hello world::%d,%s,%s\n",argc, argv[0],argv[1]);
        printf("hello world::%d,%s,%s\n",c, *(p+0),*(p+1));
       
        return 1;
}
----------------------------------------------------


compile命令 :
gcc -c test.c -o test.o
nasm -f elf test_en.asm -o test_en.o
ld test.o test_en.o -o test -lc -dynamic-linker /lib/ld-linux.so.2

结果:
Segmentation fault

.........

论坛徽章:
0
68 [报告]
发表于 2010-08-18 12:11 |只看该作者
回复 67# kallytin


    ........

论坛徽章:
0
69 [报告]
发表于 2010-08-18 13:22 |只看该作者
  1. .text
  2. .global _mystart

  3. _mystart :
  4.         movl (%esp), %ecx                               /* argc */
  5.         leal 4(%esp), %esi                              /* argv */
  6.         leal 4(%esi, %ecx, 4), %eax             /* envp */

  7.         pushl %eax
  8.         pushl %esi
  9.         pushl %ecx
  10.         call main
  11.         popl %ecx
  12.         popl %esi
  13.         popl %eax

  14.         pushl $5
  15.         call exit

  16.         /* app exit, never come here */
复制代码

论坛徽章:
0
70 [报告]
发表于 2010-08-18 13:24 |只看该作者
你可以不去看kernel源代码,可以不去看glibc源代码,至少把dietlibc源代码看看,比如说 i386/start.S
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP