Linux环境下可执行程序的安装和GCC以及ELF的初步使用,熟悉第三方函数库

一.可执行程序的安装过程

可执行程序的运行有预处理、编译、汇编、链接,四个步骤,汇编生成可执行程序。
在我的目录下有三个.c文件,main1.c,test1.c,test2.c
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.用GCC编译为3个.o文件

在这里插入图片描述

2.用 ar工具生成1个 .a 静态库文件

在这里插入图片描述

3. 用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序

在这里插入图片描述
在这里插入图片描述

4.记录文件大小

在这里插入图片描述

5. 将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件

a. 生成目标文件

在这里插入图片描述

b. 生成共享库.so

在这里插入图片描述

c. 使用.so库文件,创建可执行程序

在这里插入图片描述

在这里插入图片描述

记录文件大小

在这里插入图片描述

二.了解GCC编译工具和ELF文件格式

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语 言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另 一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。
我们以一个简单的程序实例
在这里插入图片描述

1.一步到位的编译命令

在这里插入图片描述

2.分四个阶段的编译

实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译 (Compilation)、汇编 (Assembly)和连接(Linking)。

a.预处理

在这里插入图片描述

b.编译

在这里插入图片描述

c.汇编

在这里插入图片描述

d.链接

在这里插入图片描述

e.执行结果

在这里插入图片描述

3.ELF文件

ELF文件的段

一个典型的 ELF 文件包含下面几个段: .text:已编译程序的指令代码段。 .rodata:ro 代表 read only,即只读数据(譬如常数 const)。 .data:已初始化的 C 程序全局变量和静态局部变量。 .bss:未初始化的 C 程序全局变量和静态局部变量。 .debug:调试符号表,调试器用此段的信息帮助调试。

使用 readelf -S 查看其各个 section 的信息
在这里插入图片描述

反汇编ELF

由于 ELF 文件无法被当做普通文本文件打开,如果希望直接查看一个 ELF 文件包 含的指令和数据,需要使用反汇编的方法。 使用 objdump -D 对其进行反汇编如下:
在这里插入图片描述

4.安装nasm

使用命令sudo apt-get install nasm 即可安装nasm

5.编译和运行hello.asm

在这里插入图片描述

6.记录可执行文件大小

在这里插入图片描述
在这里插入图片描述
这和c代码编译生成的程序大小一样

三.了解实际程序是如何借助第三方库函数完成代码设计

1.了解Linux 系统中终端程序最常用的光标库(curses)的主要函数功能,写出几个基本函数名称及功能

各函式分别介绍如下:

initscr(): initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动 curses 模式.
endwin(): curses 通常以呼叫 endwin() 来结束程式. endwin() 可用来关闭curses 模式, 或是暂时的跳离 curses 模式. 如果您在程式中须要call shell ( 如呼叫 system() 函式 ) 或是需要做 system call, 就必须先以 endwin() 暂时跳离 curses 模式. 最後再以wrefresh() doupdate() 来重返 curses 模式.
cbreak() and nocbreak(): 当 cbreak 模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模式时, 从键盘输入的字元将被储存在 buffer 里直到输入 RETURN或 NEWLINE.在较旧版的 curses 须呼叫 crmode(),nocrmode() 来取代 cbreak(),nocbreak()
nl() and nonl(): 用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字元 ( 如 /n ). 而输出资料时, NEWLINE 字元是否被对应为 RETURN 和 LINDFEED系统预设是开启的.
echo() and noecho(): 此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统预设是开启的.
intrflush(win,bf): 呼叫 intrflush 时须传入两个值, win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr. bf 为 TRUE 或 FALSE. 当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应将较为快速.但可能会造成萤幕的错乱.
keypad(win,bf): 呼叫 keypad 时须传入两个值, win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr. bf 为 TRUE 或 FALSE. 当开启 keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右>等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一些特殊键. 这些定义的特殊键通常以 KEY_ 开头.
refresh(): refresh() 为 curses 最常呼叫的一个函式. curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改变萤幕上的画面时, curses 并不会立刻对萤幕做改变, 而是等到refresh() 呼叫後, 才将刚才所做的变动一次完成. 其馀的资料将维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间.如果是 initscr() 後第一次呼叫 refresh(), curses 将做清除萤幕的工作.
链接: link.https://blog.csdn.net/chenxinntu/article/details/82692846
这我参考的资料,感兴趣的可以去参考原文

2.cmd命令行窗口,体验一下即将绝迹的远古时代的 BBS

在这里插入图片描述

3.安装curses库,查找头文件和库的目录

安装步骤

在这里插入图片描述

查找头文件步骤

在这里插入图片描述
头文件在/usr/include 目录下

查找库文件目录

在这里插入图片描述

体验贪吃蛇游戏

链接: link.http://www.linuxidc.com/Linux/2011-08/41375.htm
在这里插入图片描述
在运行程序时,需要添加一个time.h的头文件
运行结果:
在这里插入图片描述

四.总结

通过这次的学习我对LINUX环境下的C程序的编译和运行有了更深刻的了解,在以前都是一步完成编译,但是这次学习到了分步编译的过程,同时也学习到了curses库函数的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值