《程序员的自我修养》书中的一个例子的问题
书中第7章,有个叫runso的例子,我跑了下,有些问题,本来想给作者发个mail,但是书上还真没找到,大家有空帮小弟看看
代码是这样的:
- #include <stdio.h>
- #include <dlfcn.h>
- #define SETUP_STACK \
- i = 2; \
- while (++i < argc - 1) { \
- printf("i: %d\n", i);\
- switch (argv[i][0]) { \
- case 'i': \
- printf("%d\n", i);\
- asm volatile("push %0" :: \
- "r"(atoi(&argv[i][1])) ); \
- esp += 4; \
- printf("%d\n", i);\
- break; \
- case 'd': \
- atof(&argv[i][1]); \
- asm volatile("subl $8, %esp\n" \
- "fstpl (%esp)" ); \
- esp += 8; \
- break; \
- case 's': \
- asm volatile("push %0" :: \
- "r"(&argv[i][1]) ); \
- esp += 4; \
- break; \
- default: \
- printf("error argument type"); \
- goto exit_runso; \
- } \
- printf("%d\n", i);\
- }
- #define RESOTRE_STACK \
- asm volatile("add %0, %%esp"::"r"(esp))
- int main(int argc, char* argv[])
- {
- void *handle;
- char *error;
- int i;
- int esp = 0;
- void *func;
- handle = dlopen(argv[1], RTLD_NOW);
- if(0 == handle)
- {
- printf("Can't find library: %s\n", argv[1]);
- return -1;
- }
- func = dlsym(handle, argv[2]);
- if ((error = dlerror()) != NULL)
- {
- printf("Find symbol %s error: %s\n", argv[2], error);
- goto exit_runso;
- }
- switch (argv[argc - 1][0])
- {
- case 'i':
- {
- int (*func_int)() = func;
- SETUP_STACK;
- printf("%p\n", func_int);
- int ret = func_int();
- RESOTRE_STACK;
- printf("ret = %d\n", ret);
- break;
- }
- case 'd':
- {
- double (*func_double)() = func;
- SETUP_STACK;
- double ret = func_double();
- RESOTRE_STACK;
- printf("ret = %f\n", ret);
- break;
- }
- case 's':
- {
- char* (*func_str)() = func;
- SETUP_STACK;
- char *ret = func_str();
- RESOTRE_STACK;
- printf("ret = %s\n", ret);
- break;
- }
- case 'v':
- {
- void (*func_void)() = func;
- SETUP_STACK;
- func_void();
- RESOTRE_STACK;
- printf("ret = void");
- break;
- }
- }/* end of switch */
- exit_runso:
- dlclose(handle);
- }
复制代码运行:./runso /lib/libm-2.6.1.so sin d2.0 d
但是运行时出现segment fault, 代码和书上的一样,我跟了下发现在SETUP_STACK 宏里面出现的错误,这里本来是要把命令行里的参数解析后压入栈中,后面程序调用时使用,
但是我发现 在入栈的那段汇编代码运行后,栈就坏了,那个变量i就变成0了,所有我感觉这样的操作栈是不是不太合理,有什么解决方法吗? 或者有谁能联系到作者?问问他。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论