免费注册 查看新帖 |

Chinaunix

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

[内核入门] 疑问:汇编直接使用libc宏? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-28 14:31 |只看该作者 |倒序浏览
实验环境:32位系统。

  • 调用printf()
  1. .section .data
  2. output:
  3.     .asciz "The result is %d\n"

  4. .section .bss
  5.     .lcomm fd, 4

  6. .section .text
  7. .globl _start
  8. _start:
  9.     movl $0xffffffff, fd
  10.     movl %esp, %ebp

  11.     pushl fd
  12.     pushl $output
  13.     call printf

  14.     pushl $0
  15.     call exit
复制代码
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] as -otest.o test.s -g
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] ld test.o -lc -dynamic-linker /lib/ld-linux.so.2
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] ./a.out
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] The result is 1

  • 调用socket()
  1. .include "sys/socket.h"

  2. .section .data
  3. output:
  4.     .asciz "The result is %d\n"

  5. .section .bss
  6.     .lcomm fd, 4

  7. .section .text
  8. .globl _start
  9. _start:
  10.     movl $0xffffffff, fd
  11.     movl %esp, %ebp

  12.     pushl 0
  13.     pushl $SOCK_STREAM
  14.     pushl $AF_INET
  15.     call socket
  16.     movl %eax, fd

  17.     pushl fd
  18.     pushl $output
  19.     call printf

  20.     pushl $0
  21.     call exit
复制代码
多了几行代码,希望用fd保存socket()返回值。
① 由于链接时报SOCK_STREAM、AF_INET未定义,添加.include "sys/socket.h":
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] as -osocket.o socket.s -g
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] socket.s:1: Error: can't open sys/socket.h for reading: No such file or directory
② 编译时指令sys/socket.h路径:
xx[url=mailtox@xx:~/xxx/socket$]@xx:~/xxx/socket$[/url] as -osocket.o socket.s -I/usr/include/i386-linux-gnu -g
报了一堆错,因为sys/socket.h毕竟是个C头文件。

请问不想到C的.h头文件去确定SOCK_STREAM、AF_INET值,就是希望能在汇编里直接用这两个C的宏,怎么做?


论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
2 [报告]
发表于 2016-11-28 15:49 |只看该作者
本帖最后由 _nosay 于 2016-11-28 16:08 编辑

回复 1# _nosay


跳过libc,自己直接使用系统调用sys_socketcall()(int 0x80,系统调用号传102):int sys_socketcall(int call, unsigned long *args),它是sys_socket()、sys_bind()、sys_listen()等函数的入口,由第一次参数call区分,args是调用前为这些函数构造的所需信息的地址。

http://www.cnblogs.com/hyd-desert-camel/p/3536341.html?utm_source=tuicool&utm_medium=referral
http://blog.csdn.net/cedricporter/article/details/6786700

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
3 [报告]
发表于 2016-11-29 18:20 |只看该作者
本帖最后由 _nosay 于 2016-11-29 20:34 编辑

回复 1# _nosay



换成.S(大写)后缀,include .h文件了,编译阶段没报错,但链接时说宏没定义,看来是编译阶段没有做预处理,是不是要加什么选项?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
4 [报告]
发表于 2016-11-29 20:31 |只看该作者
回复 3# _nosay

我发现as把#当前注释了,所以.h里面的那些#define xx都被当成注释行了

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
5 [报告]
发表于 2016-11-29 21:23 |只看该作者
回复 4# _nosay

http://blog.csdn.net/qqliyunpeng/article/details/45116615,这里说“# 注释掉一整行
http://blog.csdn.net/suyong_yq/article/details/14002183?_t=t,这里又说在IAR汇编中可以使用#define、#include这些C风格预编译指令。

http://bbs.chinaunix.net/thread-4256800-1-1.html,glibc中的sysdeps/unix/sysv/linux/socket.S里面出现了好多#define、#include,那么socket.S是不是得用IAR的编译器编译呀

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
6 [报告]
发表于 2016-11-30 09:54 |只看该作者
用gcc处理.S时可以包含C头文件。只是你这例子里不光是预处理器的问题:
pushl $SOCK_STREAM
pushl $AF_INET

$AF_INET可以预处理得到$2,但SOCK_STREAM是枚举常量,这是C语言中的概念,预处理器也无法替换它。

所以既然用汇编,最好还是用汇编的语法来重新定义所用的常数吧。

另外建议用64位环境,省得以后升级麻烦(对汇编来说更是很大很大的麻烦)

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
7 [报告]
发表于 2016-11-30 11:18 |只看该作者
回复 6# 爻易

嗯,重新定义宏可以避开这个问题,但是我是搞明白这个问题,glibc好多.S文件都是直接包含了c的头文件,我昨天忘记看glibc的makefile了。
还有就是如果宏可以枚举不可以,链接时喂森么SOCK_STREAM、AF_INET都被报未定义?你可不可以先教我怎么让宏不报错

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
8 [报告]
发表于 2016-11-30 20:10 |只看该作者
glibc是有好多.S文件都是直接包含了c的头文件,但那些头文件中基本只有预处理指令,没有C语言的声明语句,如头文件sysdeps/unix/sysdep.h中,都是些#include,#define 之类'#'打头的东东

你最好还是走正道,汇编的精神就是一步一个脚印

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
9 [报告]
发表于 2016-11-30 20:16 |只看该作者
回复 8# 爻易


好的,可以加个友不?

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
10 [报告]
发表于 2016-11-30 20:29 |只看该作者
美女,可以有
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP