Linux环境下GCC以及ELF的初步使用

2023-05-16

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

  • 一、可执行程序的安装过程
    • 1.使用用gcc生成.a静态库与.so动态库文件
    • 2.静态库文件的使用
    • 3.动态库文件使用
  • 二、gcc编译工具集中各软件的用途,了解EFF文件格式,汇编语言格式
    • 1. Linux GCC常用命令
    • 2.比较hello.asm与C代码生成的文件大小
  • 三、了解实际程序是如何借助第三方库函数完成代码设计
    • 1.Linux 系统中终端程序最常用的光标库(curses)的主要函数功能
    • 2.体验一下即将绝迹的远古时代的 BBS
    • 3.安装curses库说明头文件和库文件被安装到哪些目录中
    • 4.用gcc编译生成一个终端游戏,体会curses库如何被链接和使用

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

可执行程序运行有:预处理、汇编、链接,汇编生成可执行程序。

1.使用用gcc生成.a静态库与.so动态库文件

  1. 创建main3.c,prctice.c,prctice.h文件
touch main3.c
touch practice.h
touch practice.c
  1. 用nano编辑3个文件
    main3.c文件
#include "Practice.h" 
void main()
{
	hello("wudi"); 
}

practice.c文件

#include <stdio.h> 
void hello(const char *name)
{
	printf("MyNameIs \n", name); 
}

practice.h文件

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif

  1. 将practice.c编译成.o文件
gcc -c practice.c
  1. 创建.a静态库
ar -crv libmpractice.a practice.o

在这里插入图片描述

  1. 使用静态库,生成程序practice
gcc Main.c libmyPractice.a -o Practice
  1. 创建.so动态库文件
gcc -shared -fPIC -o libmyPractice.so Practice.o

  1. 使用动态库
gcc -shared -fPIC -o libmyPractice.so Practice.o

2.静态库文件的使用

  1. 接上次实验的例子嵌入式系统程序设计基础第1,2周
    再创建一个test2.c文件并修改mian1.c文件
    mian1.c文件
#include<stdio.h>
#include"sub1.c" //用于调用sub1.c文件
#include"test2.c"//用于调用test2.c文件
void main()
{
  int a=8,b=6;      //设置两个整型变量并赋值
  float c;          //设置一个单精度变量用于x2x函数的返回值
  float d;
  c=x2x(a,b);
  d=x2y(a,b);
  printf("%f\n",c); //输出x2x的返回结果
  printf("%f\n",d); //输出x2y的返回结果
}

test.c文件

#include<stdio.h>
float x2y (int a,int b)
{
  float d;
  d=a+b;
  return d;
}

  1. 使用gcc命令编译文件
    在这里插入图片描述
  2. 将sub1.o和test2.o用 ar工具生成1个 .a 静态库文件
ar -crv libmy2xy.a sub1.o test2.o

在这里插入图片描述

  1. 使用gcc进行链接
gcc main1.c libmy2xy.a -o mainxy

在这里插入图片描述

  1. 运行main1程序
./mainxy

在这里插入图片描述

  1. ls查看文件大小
ls -l mainxy

在这里插入图片描述

3.动态库文件使用

  1. 用ar工具生成1个 .so 动态库文件
ar -crv libmy2xy.so sub1.o test2.o

在这里插入图片描述

  1. 用gcc进行链接
gcc main1.c libmy2xy.so -o mainso

在这里插入图片描述

  1. 运行main1程序
./mainso

在这里插入图片描述

  1. ls查看文件大小
ls -l mainxy

在这里插入图片描述

二、gcc编译工具集中各软件的用途,了解EFF文件格式,汇编语言格式

1. Linux GCC常用命令

  1. 创建一个main.c文件
#include <stdio.h> 
int main()
{ 
	printf("My name is wudi\n"); 
	return 0;
}
  1. 用gcc一步编译
    在这里插入图片描述

  2. 分步编译

gcc -E main.c -o main.i    //预处理
gcc -S main.i -o main.s   //转为汇编代码
gcc -c main.s -o main.o  //汇编
gcc main.o -o main      //链接生成可执行文件

在这里插入图片描述

2.比较hello.asm与C代码生成的文件大小

  1. 安装nasm
    在这里插入图片描述

  2. 新建hello.asm文件

; hello.asm
section .data            ; 数据段声明
       msg db "Hello, world!", 0xA     ; 要输出的字符串
       len equ $ - msg                 ; 字串长度
section .text            ; 代码段声明
global _start            ; 指定入口函数
_start:                  ; 在屏幕上显示一个字符串
       mov edx, len     ; 参数三:字符串长度
       mov ecx, msg     ; 参数二:要显示的字符串
       mov ebx, 1       ; 参数一:文件描述符(stdout)
       mov eax, 4       ; 系统调用号(sys_write)
       int 0x80         ; 调用内核功能
                        ; 退出程序
       mov ebx, 0       ; 参数一:退出代码
       mov eax, 1       ; 系统调用号(sys_exit)
       int 0x80         ; 调用内核功能


  1. 生成,运行hello文件并记录大小在这里插入图片描述

  2. 新建hello.c文件,运行并记录大小

#include<stdio.h>
int main()
{
	printf("hello, world!\n");
	return 0;
}

在这里插入图片描述

  1. 比较“hello.asm”编译生成可执行程序与“hello world”C代码的编译生成的程序大小可以看出,hello.asm编译生成的可执行程序比hello.c的编译生成的程序要小得多。

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

1.Linux 系统中终端程序最常用的光标库(curses)的主要函数功能

麻烦请参考Linux下curses函数库的学习

2.体验一下即将绝迹的远古时代的 BBS

在 win10 系统中,“控制面板”–>“程序”—>“启用或关闭Windows功能”,启用 “telnet client” 。 然后打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net,以游客身份体验一下即将绝迹的远古时代的 BBS。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.安装curses库说明头文件和库文件被安装到哪些目录中

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

4.用gcc编译生成一个终端游戏,体会curses库如何被链接和使用

麻烦请参考Linux下使用Curses库+时钟信号编写视频小游戏:对战贪吃蛇
curses库实现的弹球游戏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux环境下GCC以及ELF的初步使用 的相关文章

随机推荐

  • 【记录】MPU6050原理快速入门(附手册)

    目录 MPU6050 MPU6050主要参数 MPU6050通信接口 MPU6050电路 向MPU6050的一个寄存器写一个字节的数据 从MPU6050的一个寄存器读一个字节的数据 MPU6050 MPU6050是一个运动处理传感器 xff
  • 【STM32】HAL库三步实现串口重定向(代码复制可用)

    目录 第一步 xff1a 添加标准输入输出头文件 第二步 xff1a 重写fputc 函数 第三步 xff1a 重写fgetc 函数 代码汇总 xff08 直接复制使用 xff09 需要直接来复制 在PC上进行C语言程序开发时 xff0c
  • c# Post请求实例

    server span class token comment 服务器 span span class token keyword using span span class token namespace System span span
  • STM32 串口通讯及实现

    目录 一 串口通讯概述1 广义的串口2 狭义的串口3 串口数据定义4 串口通讯应用 二 STM32串口工程标准库实现1 串口的初始化2 串口数据发送 3 串口的数据接收 一 串口通讯概述 1 广义的串口 广义的串口是针对并口来说的 串口是指
  • STM32串口接受和发送数据的程序(USART/UART)

    本实验中 STM32通过串口1和串口2上位机对话 xff0c STM32通过串口1在收到上位机发过来的字符串 以回车换行结束 后 xff0c 通过串口2原原本本的返回给上位机 串口 xff08 USART UART xff09 通信配置详解
  • CMakeLists.txt中第三方库编写思考

    编写ROS时经常需要自己构建第三方库或者引用别人的第三方库 xff0c 对于第三方库的调用主要有以下两种方式 xff1a 1 引用现成的第三方库 xff1a find package PCL 1 7 REQUIRED xff1a 添加依赖
  • vscode运行卡顿解决方案

    卡顿原因 主要是rg exe扩展程序占用CPU过高 xff0c 那么只需要禁用它即可 解决方案 打开 vs code xff0c 文件 gt 首选项 gt 设置 gt 搜索 search followSymlinks 取消勾选即可
  • 优象光流模块助力无人机之使用效果分享

    优象光流模块助力无人机之使用效果分享 我是一名无人机爱好者 xff0c 一直以来对无人机就有一种慕名的喜好 xff0c 只要有时间就会与队友们在实验室研究探讨 当然 xff0c 刚开始玩无人机悬停时会遇到种种问题 xff0c 例如飞机一开始
  • 如何使用光流芯片U30实现四轴无人机悬停

    如何使用光流芯片U30实现四轴无人机悬停 在没有GPS的环境下 xff0c 比如室内环境 xff0c 四轴无人机在水平方向会不断漂移 如何让无人机实现稳定的自主悬停呢 xff1f 光流芯片可以感知无人机在水平方向的运动信息 xff08 速度
  • (CMake) 库的生成和链接

    文章目录 前言前置准备当前项目的库静态库动态库 外部项目的库静态库动态库 库的总结总code函数add subdirectory 添加源文件目录add library 指定的源文件生成库target link libraries 为目标链接
  • vscode配置C++编译环境(windows环境下)

    vscode配置C 43 43 编译环境 xff08 windows环境下 xff09 记录下自己在vscode中配置C 43 43 编译环境的过程 xff0c 仅供参考 一 VSCODE MinGW编译器 cMake跨平台编译工具下载 1
  • STL标准库详解

    STL标准库 主要由容器 迭代器 算法组成 STL主要头文件 lt algorithm gt lt deque gt lt functional gt lt iterator gt lt vector gt lt list gt lt ma
  • Mask R-CNN详解(图文并茂)

    Mask R CNN Mask R CNN是一个实例分割 xff08 Instance segmentation xff09 算法 xff0c 主要是在目标检测的基础上再进行分割 Mask R CNN算法主要是Faster R CNN 43
  • python-roslaunch : 依赖: python-roslib 但是它将不会被安装

    在配置环境中将python配置删除类 xff0c 导致ROS系统的好多依赖都没了 安装配置ROS时遇到问题 xff1a 1 先按ROS WIKI上进行安装 xff0c 之后进行测试看是否安装上 2 测试代码 xff1a 第一个终端 xff1
  • pycharm函数调用关系可视化(Graphviz + pycallgraph画图)

    文章目录 介绍Graphviz 安装pycallgraph安装实践 介绍 一个 python project 中往往包含很多 py 文件 python文件中又会包含很多函数 xff0c 函数之间相互传参和调用 如果遇到代码行数很多的情况 x
  • Linux下的UDP通信

    socket 函数 函数说明 xff1a 建立新的socket通信 头文件 xff1a include lt sys socket h gt include lt sys types h gt 函数定义 xff1a int socket i
  • error: array type has incomplete element type ‘int[]‘

    项目场景 xff1a 数组作为函数的形参 问题描述 xff1a error array type has incomplete element type 39 int 39 原因分析 xff1a 多维数组做为函数参数时 xff0c 只可以省
  • 【stm32F1_GPIO初始化函数的参数含义】

    文章目录 前言一 LED 点灯实验二 疑问记录1 问题描述2 问题解决 总结 前言 之前学习过51 xff0c 现在转学32 xff0c 由于课题组需要 xff0c 我需要尽量短的时间内掌握stm32的用法以及Freertos的操作系统 从
  • 使用 curl 命令发送 POST 请求的几种方式

    使用 curl 命令发送 POST 请求的几种方式 HTTP 的 POST 请求通常是用于提交数据 xff0c 可以通过这篇文章来了解各种提交方式 xff1a 常见的 POST 提交数据方式 做 Web 后端开发时 xff0c 不可避免地要
  • Linux环境下GCC以及ELF的初步使用

    Linux环境下可执行程序的安装和GCC以及ELF的初步使用 xff0c 熟悉第三方函数库及游戏程序介绍 一 可执行程序的安装过程1 使用用gcc生成 a静态库与 so动态库文件2 静态库文件的使用3 动态库文件使用 二 gcc编译工具集中