原稿地址,我是豹哥

正文地址:http://www.cnblogs.com/aiweixiao/p/7759790.html

 
 对于.NET的分布式应用开发,可以供我们挑选的技艺和框架相比较多,例如webservice,.net
remoting,MSMQ,WCF等等技术。对于那个技巧很多个人都不会陌生,即时没有深远的打听,可是一定听说过,每种技术都各有优势和适用范围,没有断然的好坏,只有绝对的相当程度。但是可惜了,今日我们讲解的核心不是这两种技术,前日紧要教学的是ASP.NET
WebAPI。


原稿地址:(微信公众号)

   对于ASP.NET
WebAPI的优势和特性,在此处就不讲了,需要利用的本来就会拔取,也不需要自己浪费篇幅去讲授那一个,这篇博文重要助教ASP.NET
WebAPI中的HTTP音讯的协会和拍卖信息的主干目的。

  大家好,我是豹哥,猎豹的豹,犀利哥的哥。明日豹哥给我们讲的是嵌入式开发里的executable文件(elf)

 

一.WebAPI的HTTP概述:

 
 有关HTTP协议的连带内容在此间就不做牵线,在作者前面的博文中一度做过介绍,现在提供一下地点,因为过多的废话就是浪费时间,我就姑且看这篇博文的读者已经对HTTP协议和WebAPI都独具了然。博文地址:

http://www.cnblogs.com/pengze0902/p/5976388.html

http://www.cnblogs.com/pengze0902/p/6224792.html

http://www.cnblogs.com/pengze0902/p/6230105.html

  第四、五节课里,豹哥已经给咱们介绍了2种output文件,本文继续给我们讲project生成的另一种output文件-executable文件,也是专程首要性的output文件。

原创 2017-10-30 微信号wozhuzaisi 程序员的文娱情怀

   1.在.NET4.5事先的版本中,处理HTTP的主导目的:

     
(1).在客户端:System.Net.HttpWebRequest用于开头化HTTP请求,处理有关的响应; System.Net.HttpWebResponse处理HTTP响应头和多少读取的查找。

     
(2).在劳动器端:System.Web.HttpContext,System.Web.HttpRequest,System.Web.HttpResponse类用在ASP.NET上下文中,代表单个请求和响应。System.Net.HttpListenerContext类,提供对HTTP请求和响应对象的访问。

  文件涉及:linker文件

公海赌船网站 1

   2.在.NET4.5版本中,处理HTTP的着力目的:

     
(1).在客户端和劳务器端使用同一的类。(HttpRequestMessage和HttpResponseMessage对象中不带有上下文信息,所以可以在服务器和客户端共用。)

     
(2).由于在.NET4.5中引入了TAP(异步任务模型),所以在新的HTTP模型中,处理HTTP请求的办法可以运用async和awit实现异步编程。(可以概括便捷的贯彻异步编程)

   
我们对此新旧的HTTP编程模型时,会很容易的觉察在新本子的HTTP模型中,无论是编程的难度和代码编写的精简度,已经履行的功用都是很高的。在对于Web项目标开支中,我们对HTTP知识的问询是必备的,对于ASP.NET的HTTP处理的原理在这里就不做实际的介绍,网上也有相比多的篇章可供阅读和询问。

   
对于ASP.NET的HTTP处理格局的问询,是我在付出微信公众平台时更加深造的,微信公众平台提供了对外访问的接口,我们的顺序和服务器对微信服务器的接口举行呼吁访问,微信服务器获取HTTP请求后,再次来到处理结果,本地服务器获取重回结果。这样一个请求-响应格局,组成一个对话。对于微信公众平台的付出对于众多刚学习.NET的人来说有点高大(当然这是相持而言),即时开发过很频繁这些类型的主次的人(调用第三方接口的开销)也不必然可以很清晰的明亮这么些里面的法则,笔者以为对于如此的第三方平台的付出,其关键的基本部分就是对此HTTP协议的拍卖,建立请求、获取响应信息和剖析音讯这三大步子,再次来到的音讯内容相似为json或者xml,获取响应音信后,首假若对音讯内容的反连串化,得到信息的实体音讯,进而在先后中越来越处理。

   
在WeAPI中音信的发出和分析,以及信息的格式都是足以动态的创建和磋商,下边我们更是的问询实现这一历程的主干目标。

一、引子

二.WebAPI的HTTP信息分析:

     
HTTP协议的工作措施是在客户端和服务器之间交流请求和响应音讯,那么这也就足以作证HTTP的主干就是消息,对于“消息”的刺探,我们只要明白消息分为“音信头部”和“音讯内容”,我们接下去的对新HTTP编程模型的介绍的主心骨就是“信息头部”和“消息内容”。

     
在命名空间System.Net.Http中,具有五个着力目的:HttpRequestMessage和HttpResponseMessage。多少个目的的构造如下图:

公海赌船网站 2

     
以上紧要讲师了HttpRequestMessage对象和HttpResponseMessage对象涵盖的关键内容,请求和响应信息都足以蕴涵一个可选的消息正文,两中信息类型以及音信内容,都得以动用响应的标头。接下来具体精通一些信息的布局。

  仔细看过豹哥此前课程的仇人肯定精通,豹哥在第四节课relocatable文件里介绍的object文件在格式上其实跟本文要讲的elf文件是近乎的,它们都属于ELF文件分支。只不是relocatable文件只是中等过渡文件,而本文要讲的elf却是标准的output文件,这些文件几乎涵盖了工程的享有信息,有了这一个文件我们既可以在线调试工程,也可以将elf文件转换成image文件,直接下载image文件数据进芯片中脱机运行。明天豹哥就为我们仔细分析elf文件。

 

    1.HttpRequestMessage目的解析:

         (1).HttpRequestMessage重要性能和章程概述:

名称 说明
Version 获取或设置 HTTP 消息版本
Content 获取或设置 HTTP 消息的内容
Method 获取或设置 HTTP 请求信息使用的 HTTP 方法
RequestUri 获取或设置 HTTP 请求的 Uri
Headers 获取 HTTP 请求标头的集合
Properties 获取 HTTP 请求的属性集
ToString 返回表示当前对象的字符串

        该对象重要用来表示 HTTP
请求音讯。对于该对象的这么些属性和章程,大部分应当都不会陌生,因为一个HTTP音讯中首要性含有头部、音讯内容等等,在这边最重要介绍一个性能Properties,该属性并不属于其他正规的HTTP音信,当新闻传输时,不会保留该属性。

         (2).Properties属性解析:

[__DynamicallyInvokable]
public IDictionary<string, object> Properties
{
    [__DynamicallyInvokable]
    get
    {
        if (this.properties == null)
        {
            this.properties = new Dictionary<string, object>();
        }
        return this.properties;
    }
}

   
有上述的代码能够很强烈的观看该属性只有一个只读属性,并回到一个IDictionary<string,
object>。当信息在服务器或者客户端本地开展处理时,该属性用于保存附加的信息消息。该属性只是一个通用的容器,保存本地信息属性。(与接受新闻的总是相关的客户端认证;将新闻与布局路由举办匹配,得到的路由数据)

一、elf文件基础

  ELF全称Executable and Linkable
Format,可实施连接格式,ELF格式的文件最早用于存储Linux程序,后衍变到ARM系统上存储ARM程序。ELF文件(目标文件)格式首要二种:

  • 可重定向文件:用来和此外的目的文件一起来创设一个可执行文件或者共享目标文件(也称object文件或者静态库文件,平常后缀为.o和.a的文本)。那多少个文件是用来编译和链接阶段。
  • 可执行文件:用于转移应用image,载入存储器执行(后缀通常为.out或者.elf)。这么些文件是用来加载执行等级。
  • 共享目的文件:用于和其它共享目的文件或者object文件一起生成可执行文件,或者和可执行文件一起创制应用image。(也称共享库文件,后缀为.so的文件)。这么些文件既可用来编译和链接阶段,也可用来加载执行等级。

  我们在ARM开发中更多接触的是前二种格式,第一种格式前面系列小说relocatable文件一度介绍过,本文的顶梁柱是第二种格式-可执行文件。不管是哪类格式的ELF文件,其都可能含有如下二种基本索引表:

  • file header:一般在文件的起来,描述了ELF文件的总体协会情状。
  • program
    header
    :告诉系统怎样制造image,可执行文件必须拥有program
    header,而可重定向文件则不需要。
  • section
    header
    :包含了描述文件section的音信,每个section都有一个header,每一个header给出诸如section名称、section大小等音讯。可重定向文件必须带有section
    header。

  既然知道了留存二种索引表,那么表的构造定义在何地呢?github上的linux仓库里有实际定义,在elf.h头文件里。

Linux仓库:https://github.com/torvalds/linux.git
elf.h路径:\linux\include\uapi\linux\elf.h

  打开elf.h文件便可找到两个表的原型定义,鉴于近期的ARM
Cortex-M都是32bit,所以这边仅列出32bit下的表的原型:Elf32_Ehdr、Elf32_Phdr、Elf32_Shdr。

// file header
#define EI_NIDENT    16
typedef struct elf32_hdr{
  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
  Elf32_Half    e_type;                 /* Object file type */  
  Elf32_Half    e_machine;              /* Architecture */  
  Elf32_Word    e_version;              /* Object file version */  
  Elf32_Addr    e_entry;                /* Entry point virtual address */  
  Elf32_Off     e_phoff;                /* Program header table file offset */  
  Elf32_Off     e_shoff;                /* Section header table file offset */  
  Elf32_Word    e_flags;                /* Processor-specific flags */  
  Elf32_Half    e_ehsize;               /* ELF header size in bytes */  
  Elf32_Half    e_phentsize;            /* Program header table entry size */  
  Elf32_Half    e_phnum;                /* Program header table entry count */  
  Elf32_Half    e_shentsize;            /* Section header table entry size */  
  Elf32_Half    e_shnum;                /* Section header table entry count */  
  Elf32_Half    e_shstrndx;             /* Section header string table index */ 
} Elf32_Ehdr;

// program header
typedef struct elf32_phdr{
  Elf32_Word    p_type;           /* Segment type */
  Elf32_Off     p_offset;         /* Segment file offset */
  Elf32_Addr    p_vaddr;          /* Segment virtual address */
  Elf32_Addr    p_paddr;          /* Segment physical address */
  Elf32_Word    p_filesz;         /* Segment size in file */
  Elf32_Word    p_memsz;          /* Segment size in memory */
  Elf32_Word    p_flags;          /* Segment flags */
  Elf32_Word    p_align;          /* Segment alignment, file & memory */
} Elf32_Phdr;

// section header
typedef struct elf32_shdr {
  Elf32_Word    sh_name;          /* Section name, index in string tbl */
  Elf32_Word    sh_type;          /* Type of section */
  Elf32_Word    sh_flags;         /* Miscellaneous section attributes */
  Elf32_Addr    sh_addr;          /* Section virtual addr at execution */
  Elf32_Off     sh_offset;        /* Section file offset */
  Elf32_Word    sh_size;          /* Size of section in bytes */
  Elf32_Word    sh_link;          /* Index of another section */
  Elf32_Word    sh_info;          /* Additional section information */
  Elf32_Word    sh_addralign;     /* Section alignment */
  Elf32_Word    sh_entsize;       /* Entry size if section holds table */
} Elf32_Shdr;

  不知何时起,屌丝那些词火遍了大江南北,不仅是成千上万老公都自嘲为屌丝,就连过多表妹也都说自己的是“女屌丝”,没有用过像样牌子的化妆品,没有通过丝袜和比基尼。唉,屌丝苦啊。

   2.HttpResponseMessage对象解析:

        (1).HttpRequestMessage紧要性能和办法概述:

名称 说明
EnsureSuccessStatusCode 如果 HTTP 响应的 IsSuccessStatusCode 属性为  false, 将引发异常
StatusCode 获取或设置 HTTP 响应的状态代码
ReasonPhrase 获取或设置服务器与状态代码通常一起发送的原因短语
RequestMessage 获取或设置导致此响应消息的请求消息
IsSuccessStatusCode 获取一个值,该值指示 HTTP 响应是否成功

     
对于该对象的片段特性没有列举,因为在HttpRequestMessage对象已经介绍,如:Version、Content、Headers等,该目标紧要用来表示
HTTP 响应信息。在这边紧要介绍StatusCode属性。

       (2).StatusCode属性:

[__DynamicallyInvokable]
public HttpStatusCode StatusCode
{
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    get
    {
        return this.statusCode;
    }
    [__DynamicallyInvokable]
    set
    {
        if ((value < ((HttpStatusCode) 0)) || (value > ((HttpStatusCode) 0x3e7)))
        {
            throw new ArgumentOutOfRangeException("value");
        }
        this.CheckDisposed();
        this.statusCode = value;
    }
}

   
 StatusCode属性为枚举属性,该属性可读可写,对于状态码这一个概念,很三个人都是相比较精晓的,在HTTP协议中,状态码紧如果代表在音讯的伸手在服务器中拍卖的结果,状态有2XX,3XX,4XX,5XX等等,具体表示的意义就不再描述。

二、解析elf文件

  所谓工欲善其事,必先利其器,在开班解析elf文件在此以前,大家亟须先找到一款合适的分析工具,readelf就是GNU/Linux官方推出的专用解析工具。有了这多少个分析工具,我们便足以渐渐分析elf文件。

公海赌船网站 3

     3.HTTP模型音信标头解析:

         
在HTTP中,请求和响应音讯,以及信息内容本身,都足以应用称为标头的附加字段,包含更多的音讯。

       (1).标头分类:

标头名称 描述 HTTP模型标头容器类
User-Agent 为请求提供扩展信息,描述产生这个请求的应用程序 HttpRequestHeaders
Server 为响应提供关于源服务器软件的扩展信息 HttpResponseHeaders
Content-Type 定义请求或响应有效载荷正文中,资源表示使用的媒体类型 HttpContentHeaders

       (2).HttpHeaders抽象类分析:

名称 描述
Add 添加指定的标头及其值到 HttpHeaders 集合中。
TryAddWithoutValidation 返回一个值,该值指示指定标头及其值是否已添加到HttpHeaders 集合,而未验证所提供的信息。
Clear 从 HttpHeaders 集合中移除所有标头。
Remove 从HttpHeaders集合中移除指定的标头。
GetValues 返回存储在HttpHeaders 集合中所有指定标头的标头值。
Contains 如果指定标头存在于 HttpHeaders 集合则返回。
ToString 返回表示当前 HttpHeaders对象的字符串。

     
 HttpHeaders是一个抽象类,HttpRequestHeaders、HttpResponseHeaders、HttpContentHeaders六个类继承了此类。接下来我们来询问一下Add()方法:

[__DynamicallyInvokable]
public void Add(string name, string value)
{
    HeaderStoreItemInfo info;
    bool flag;
    this.CheckHeaderName(name);
    this.PrepareHeaderInfoForAdd(name, out info, out flag);
    this.ParseAndAddValue(name, info, value);
    if (flag && (info.ParsedValue != null))
    {
        this.AddHeaderToStore(name, info);
    }
}

     
 Add()方法具有六个重载版本,该措施可以向容器添加标头,即使要增长的标头有标准名,在增长在此之前标头值会举行表达。Add方法还会申明标头是否足以有多个值。

2.1 解析工具readelf

  既然elf文件是Linux系统下常用的可执行文件格式,那么Linux社区一定会有配套的工具去分析它,是的,这一个工具就叫readelf,在GNU工具集binutils里。

公海赌船网站 4

   4.HTTP音信内容分析:

     
在.NET4.5本子的HTTP模型中,HTTP音信的正文由抽象基类HttpContent表示,HttpResponseMessage和HttpRequestMessage对象都含有一个HttpContent类型的Content属性。

     (1).HttpContent紧要性能和形式:

名称 描述
ReadAsByteArrayAsync 以异步操作将 HTTP 内容写入字节数组。
SerializeToStreamAsync 以异步操作将 HTTP 内容序列化到流。
CopyToAsync 以异步操作将 HTTP 内容写入流。
LoadIntoBufferAsync 以异步操作将 HTTP 内容序列化到内存缓冲区。
CreateContentReadStreamAsync 以异步操作将 HTTP 内容写入内存流。
TryComputeLength 确定 HTTP 内容是否具备有效的字节长度。
Headers 根据 RFC 2616 中的定义,获取内容标头。

     (2).CopyToAsync()方法分析:

[__DynamicallyInvokable]
public Task CopyToAsync(Stream stream, TransportContext context)
{
    Action<Task> continuation = null;
    this.CheckDisposed();
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    try
    {
        Task task = null;
        if (this.IsBuffered)
        {
            task = Task.Factory.FromAsync<byte[], int, int>(new Func<byte[], int, int, 
            AsyncCallback, object, IAsyncResult>(stream.BeginWrite), new Action<IAsyncResult>(stream.EndWrite), 
       this.bufferedContent.GetBuffer(), 0, (int) this.bufferedContent.Length, null);
        }
        else
        {
            task = this.SerializeToStreamAsync(stream, context);
            this.CheckTaskNotNull(task);
        }
        if (continuation == null)
        {
            continuation = delegate (Task copyTask) {
                if (copyTask.IsFaulted)
                {
                    tcs.TrySetException(GetStreamCopyException(copyTask.Exception.GetBaseException()));
                }
                else if (copyTask.IsCanceled)
                {
                    tcs.TrySetCanceled();
                }
                else
                {
                    tcs.TrySetResult(null);
                }
            };
        }
        task.ContinueWithStandard(continuation);
    }
    catch (IOException exception)
    {
        tcs.TrySetException(GetStreamCopyException(exception));
    }
    catch (ObjectDisposedException exception2)
    {
        tcs.TrySetException(GetStreamCopyException(exception2));
    }
    return tcs.Task;
}

   
在使用音讯内容时,需要利用HtppContent的法子仍旧扩张方法。在HttpContent中利用CopyToAsync()方法以推送格局访问原本的音信内容,由艺术代码能够见到,该办法接受两个参数,一个是流对象,一个是关于传输的音信(例如,通道绑定),此参数可以为
null。该情势可以把音讯内容写入到这么些流中。

    在该办法的兑现代码中
创立了一个TaskCompletionSource<object>的泛型对象,该目的表示未绑定到委托的 Task<TResult> 的创建者方,并经过 Task 属性提供对使用者方的拜会。SerializeToStreamAsync方法将盛传的流对象体系化,该措施为异步方法。

   
我们需要留意的几点,首要为委托的开创和动用,在C#中,尽量选用有.NET提供的委托类,不要自己去创立。还有少数就是在先后中对那一个的处理格局,卓殊的破获具有层次性,并且调用了自定义的一个可怜处理办法TrySetException。

    (2).ReadAsStreamAsync()方法分析:

     
在收获原始消息内容时,除了调用上边介绍的点子外,仍可以够调用ReadAsStreamAsync()方法以拉取的主意访问原本的音讯内容。

     
在HttpContent中含有有另外几个八九不离十的模式,ReadAsStringAsync()和ReadAsByteArrayAsync()异步的提供信息内容的缓冲副本,ReadAsByteArrayAsync()重返原始的字节内容,ReadAsStringAsync()将内容解码为字符串重返。

2.1.1 GNU工具集(binutils)

  GNU是“GNU’s Not
Unix”的递归缩写,又称作GNU计划,很多著名的开源软件及工具都是GNU开发的(比如知名的C语言编译器GCC)。binutils是GNU一体系binary小工具的成团,我们从底下的链接里找到官方binutils包。

主页:http://www.gnu.org/software/binutils/
仓库:git://sourceware.org/git/binutils-gdb.git
下载:http://ftp.gnu.org/gnu/binutils/
文档:https://sourceware.org/binutils/docs-2.29/binutils/index.html

  可是利用上述包里的readelf会有一个问题,上述工具是在Linux系统下拔取的,而我们通常做ARM
Cortex-M开发很多都是在windows平台下,那么怎么在windows下利用readelf工具呢?别急,cygwin给了俺们帮忙。

屌丝-多么痛的精晓

三.DotNet中新旧HTTP模型解析:

2.1.2 cygwin(windows下使用GNU)

  Cygwin是一个在windows平台上运行的类UNIX模拟条件,是cygnus
solutions公司(已被Redhat收购)开发的自由软件。它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,尤其是使用GNU工具集在Windows上展开嵌入式系统开发,分外实惠。

// 下载链接
Installer:http://cygwin.com/install.html
Package:  https://cygwin.com/packages/package_list.html
// 相关包(根据平台选择)
binutils                - GNU assembler, linker, and similar utilities
cygwin32-binutils       - Binutils for Cygwin 32bit toolchain
mingw64-x86_64-binutils - Binutils for MinGW-w64 Win64 toolchain 
mingw64-i686-binutils   - Binutils for MinGW-w64 Win32 toolchain

  下载安装好cygwin包后,便可在设置目录下\cygwin64\bin\找到x86_64-w64-mingw32-readelf.exe工具(豹哥采用的是mingw64-x86_64-binutils包)。

 

   1..NET4.5事先版本创制HTTP POST请求实例:

        public static string HttpPost(string postUrl, string postData)
        {
            if (string.IsNullOrEmpty(postUrl))
                throw new ArgumentNullException(postUrl);
            if (string.IsNullOrEmpty(postData))
                throw new ArgumentNullException(postData);
            var request = WebRequest.Create(postUrl) as HttpWebRequest;
            if (request == null)
                throw new ArgumentNullException("postUrl");
            try
            {
                var cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                var data = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = data.Length;
                var outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据,获取对应HTTP请求的响应
                var response = request.GetResponse() as HttpWebResponse;
                if (response != null)
                {
                    var instream = response.GetResponseStream();
                    var content = string.Empty;
                    if (instream == null)
                    {
                        return content;
                    }
                    using (var sr = new StreamReader(instream, Encoding.UTF8))
                    {
                        content = sr.ReadToEnd();
                    }
                    return content;
                }
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (IOException ioex)
            {
                throw ioex;
            }
            return null;
        }
2.1.3 readelf.exe用法

  readelf.exe听从标准的windows命令行用法,使用–help可以列出所有命令option及其简介,下面仅列出相比常用的option。

C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe --help
Usage: readelf <option(s)> elf-file(s)
 Display information about the contents of ELF format files
 Options are:
  -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I
  -h --file-header       Display the ELF file header
  -l --program-headers   Display the program headers
     --segments          An alias for --program-headers
  -S --section-headers   Display the sections' header
     --sections          An alias for --section-headers
  -t --section-details   Display the section details
  -e --headers           Equivalent to: -h -l -S
  -s --syms              Display the symbol table
     --symbols           An alias for --syms
  --dyn-syms             Display the dynamic symbol table
  -r --relocs            Display the relocations (if present)
  -d --dynamic           Display the dynamic section (if present)
  -V --version-info      Display the version sections (if present)
  -A --arch-specific     Display architecture specific information (if any)
  -I --histogram         Display histogram of bucket list lengths
  @<file>                Read options from <file>

二、映像屌丝

   2..NET4.5版本创立HTTP POST请求实例:

async static void getResponse(string url)
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync(url))
                {
                    using (HttpContent content = response.Content)
                    {
                        string myContent = await content.ReadAsStringAsync();
                    }
                }
            }
        }
        async static void postResponse(string url)
        {
            while (true)
            {
                IEnumerable<KeyValuePair<string, string>> queries = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string> ("test","test")
            };
                HttpContent q = new FormUrlEncodedContent(queries);
                using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = await client.PostAsync(url, q))
                    {
                        using (HttpContent content = response.Content)
                        {
                            string myContent = await content.ReadAsStringAsync();

                            Console.WriteLine(myContent);
                        }
                    }
                }
            }
        }

2.2 渐渐分析elf文件

  万事俱备了,先河分析elf文件,以第三节课project文件里demo工程为例。编译链接该工程可在D:\myProject\bsp\builds\demo\Release\Exe路径下得到demo.elf文件。该文件大小32612
bytes,显明这样简单的一个小工程image
size不容许这样大,表达elf文件里的笔录音信数据占比卓殊大。

【01 什么是屌丝】:

四.总结:

 
 以上重大讲师了.NET4.5事先和今后版本对HTTP编程格局的片段内容, 两者的紧要区别在于.NET4.5本子在此之前的HTTP编程模型会区分客户端和服务器,两者接纳的靶子存在不同,实现的规律上即使存在必然的相似性,可是利用的类却今非昔比。.NET4.5之后的本子中,对象的利用没有客户端和服务器之分,两者可以共用。

2.2.1 获得file header
C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -h demo.elf
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x41
  Start of program headers:          31740 (bytes into file)
  Start of section headers:          31772 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         21
  Section header string table index: 1

  第一步首先分析file header,前边介绍里说过file
header是位于文件最前面的。通过readelf -h命令可以获得file
header解析后的新闻。让我们来比较一下,使用HexEditor直接打开demo.elf可获取如下数据,仅取前52bytes(0x34)数据,因为Elf32_Ehdr大小就是52bytes:

offset(h)
00000000: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00
00000010: 02 00 28 00 01 00 00 00 41 00 00 00 FC 7B 00 00
00000020: 1C 7C 00 00 00 00 00 05 34 00 20 00 01 00 28 00
00000030: 15 00 01 00 -- -- -- -- -- -- -- -- -- -- -- --

  可以看看前16byte是e_ident[16],与分析后的Magic是如出一辙的;再来验证prgram
header偏移e_phoff=0x00007BFC,数量e_phnum=0x0001,大小e_phentsize=0x0020,也是与分析后的信息匹配的;余下可机关对照。


2.2.2 获得program header
C:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -l demo.elf

Elf file type is EXEC (Executable file)
Entry point 0x41
There are 1 program headers, starting at offset 31740

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000034 0x00000000 0x00000000 0x004c4 0x004c4 R E 0x100

 Section to Segment mapping:
  Segment Sections...
   00     A0 rw P1 ro

  再来分析program header,通过readelf -l命令可以取得program
header解析后的信息。从地方可以摸清header起始地点在demo.elf的31740
byte处(与file header里的e_phoff消息是呼应的),header信息指示program
data从offset 0x34先河,大小共0x4c4
bytes,Reset_Handler入口是0x41。继续在HexEditor查看31740处起初的32byte数据,因为Elf32_Phdr大小就是32bytes:

offset(h)
00007BF0: -- -- -- -- -- -- -- -- -- -- -- -- 01 00 00 00
00007C00: 34 00 00 00 00 00 00 00 00 00 00 00 C4 04 00 00
00007C10: C4 04 00 00 05 00 00 00 00 01 00 00 -- -- -- --

  可以看来p_offset=0x00000034,p_memsz=0x000004c4,
与地点解析后的音讯是一模一样的;余下可机关对照。
那里的新闻就相比关键了,因为这提醒了整个image
binary数据所在(知道了这些信息,我们便可以直接写脚本按照elf文件生成image
binary),继续在HexEditor里看下来(仅截取部分显得):

offset(h)
00000030: -- -- -- -- 00 20 00 10 41 00 00 00 03 04 00 00
00000040: 3F 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000060: 61 04 00 00 00 00 00 00 00 00 00 00 63 04 00 00
00000070: 65 04 00 00 72 B6 0E 48 0E 49 88 60 00 22 00 23
00000080: 00 24 00 25 00 26 00 27 B8 46 B9 46 BA 46 BB 46

  ARM系统的image前16个指针都是系统中断向量,我们可以看看SP=0x10002000,
PC=0x00000041,这与地方解析的Reset_Handler入口是0x41是匹配的。

     
屌丝指的就是入账相比低,生活层次相比低的一类人。很六人都自称屌丝,与之绝对的就是高富帅和白富美。是中国网络文化兴邦后发出的冷嘲热讽用语,先河经常作为称呼“矮矬穷”(与“高富帅”或“白富美”相对)的人。其中“屌丝”最明显的表征是穷,房子、车子对于屌丝来说是遥不可及的梦。

2.2.3 获得section header
c:\cygwin64\bin>x86_64-w64-mingw32-readelf.exe -S demo.elf
There are 21 section headers, starting at offset 0x7c1c:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 006338 000000 00      0   0  4
  [ 1] .shstrtab         STRTAB          00000000 006338 0000e6 00      0   0  4
  [ 2] .strtab           STRTAB          00000000 006420 000b7c 00      0   0  4
  [ 3] .symtab           SYMTAB          00000000 006f9c 000c60 10      2 135  4
  [ 4] A0 rw             PROGBITS        00000000 000034 000040 01  AX  0   0 256
  [ 5] P1 ro             PROGBITS        00000040 000074 000484 01  AX  0   0  4
  [ 6] P3 ui             NOBITS          10000000 0004f8 002000 01  WA  0   0  8
  [ 7] P2 rw             NOBITS          10002000 0004f8 000438 01  WA  0   0  8
  [ 8] .debug_abbrev     PROGBITS        00000000 0004f8 0002c6 01      0   0  0
  [ 9] .debug_aranges    PROGBITS        00000000 0007c0 00016c 01      0   0  0
  [10] .debug_frame      PROGBITS        00000000 00092c 00057c 01      0   0  0
  [11] .debug_info       PROGBITS        00000000 000ea8 000e2e 01      0   0  0
  [12] .debug_line       PROGBITS        00000000 001cd8 000dcb 01      0   0  0
  [13] .debug_loc        PROGBITS        00000000 002aa4 00024c 01      0   0  0
  [14] .debug_macinfo    PROGBITS        00000000 002cf0 00011e 01      0   0  0
  [15] .debug_pubnames   PROGBITS        00000000 002e10 00012a 01      0   0  0
  [16] .iar.debug_frame  PROGBITS        00000000 002f3c 00007e 01      0   0  0
  [17] .iar.debug_line   PROGBITS        00000000 002fbc 000367 01      0   0  0
  [18] .comment          PROGBITS        00000000 003324 002fa2 01      0   0  0
  [19] .iar.rtmodel      PROGBITS        00000000 0062c8 000047 01      0   0  0
  [20] .ARM.attributes   ARM_ATTRIBUTES  00000000 006310 000026 01      0   0  0
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  y (purecode), p (processor specific)

  再来分析section header,通过readelf -S命令能够获取section
header解析后的音信。可以看来有许几个section,其中最着重的4个section是A0(readonly
vector), P1(readonly code,data), P2(readwrite data, heap),
P3(STACK)。具体分析,各位朋友自己试试看。

公海赌船网站 5

2.2.4 获得symbol list
c:cygwin64\bin>x86_64-w64-mingw32-readelf.exe -s demo.elf

Symbol table '.symtab' contains 198 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
    74: 10002018    16 OBJECT  LOCAL  DEFAULT    7 s_array
    75: 10002014     4 OBJECT  LOCAL  DEFAULT    7 s_variable0
    76: 10002010     4 OBJECT  LOCAL  DEFAULT    7 s_variable2
   135: 00000000     0 OBJECT  GLOBAL DEFAULT    4 __vector_table
   140: 00000041     0 FUNC    GLOBAL DEFAULT    5 Reset_Handler
   141: 00000098     4 OBJECT  GLOBAL DEFAULT    5 s_constant
   142: 000000ad    32 FUNC    GLOBAL DEFAULT    5 main
   143: 000000cd    14 FUNC    GLOBAL DEFAULT    5 normal_task
   144: 000000db    60 FUNC    GLOBAL DEFAULT    5 heap_task
   155: 0000034d    84 FUNC    GLOBAL DEFAULT    5 init_data_bss
   156: 000003a1    18 FUNC    GLOBAL DEFAULT    5 init_interrupts
   157: 000003dd    12 FUNC    GLOBAL DEFAULT    5 SystemInit
   186: 10002001    16 FUNC    GLOBAL DEFAULT    7 ram_task
   191: 10002034     4 OBJECT  GLOBAL DEFAULT    7 n_variable1

  通过readelf -s命令可以收获symbol
list解析后的音信。可以看看有过三个symbol,豹哥在这边仅列出利用工程里自定义的函数和变量,从symbol表里我们得以摸清函数/变量在存储器中切实分配地址和长短,这对于我们进一步分析和调剂应用是有帮助的。

屌丝-我为屌丝代言-史玉柱

2.3 elf文件layout

  经过上一节对demo.elf里相继header的分析,此时我们便可以粗略地画出elf文件layout。

File offset Data content Data size in bytes
0x00000000 ELF file header 52
0x00000034 Image binary (Section4-A0 rw, .intvec中断向量表) 0x40
0x00000074 Image binary (Section5-P1 ro, readonly section(.text, .rodata…)) 0x484
0x000004F8 Section8-20 (包含各种辅助调试和系统段.debug_xx, .iar.xx) 0x5E3E
0x00006336 NULL 0x2
0x00006338 Section1-.shstrtab字符串表 0xE6
0x00006420 Section2-.strtab字符串信息 0xB7C
0x00006F9C Section3-.symtab符号信息 0xC60
0x00007BFC ELF Program header 0x20
0x00007C1C ELF Section headers (0 – 20) 21 * 40

 

番外一、几个elf转换image工具

  在今天的番外篇里,豹哥给我们顺便介绍几款专业的elf文件转换成image文件的工具。

     
典型的“屌丝”,集自卑、辛酸、自嘲、恶搞于一身。“屌丝”不是有志青年,更不是人才,从年纪上看,“屌丝”多是上80后或者90后的刚踏入社会的小伙或者在校学员,随着网络的不胫而走,越来越三人喜好用屌丝来描写自己。“屌丝们”比较上一代,他们越是独立,更加有个性,但机会和机遇却是比60后、70后更差。显而易见,“屌丝”一词本质上是在开协调玩笑,开旁人玩笑,因而不值得某些对“屌丝”一词不屑一顾的人对此隆重批判。

工具1:GNU工具objcopy

位置:C:\cygwin64\bin>x86_64-w64-mingw32-objcopy.exe
用法:
      objcopy.exe -O binary -S demo.elf demo.bin
      objcopy.exe -O srec   -S demo.elf demo.s19

备注:一说需用arm-linux-objcopy,待验证

【02 屌丝的表现】:

工具2:IAR工具ielftool.exe

位置:\IAR Systems\Embedded Workbench xxx\arm\bin\ielftool.exe
用法:
      ielftool.exe --bin  demo.elf demo.bin
      ielftool.exe --ihex demo.elf demo.hex
      ielftool.exe --srec demo.elf demo.s19

  至此,嵌入式开发里的executable文件(elf)文件豹哥便介绍完毕了,掌声在什么地方~~~


     
 屌丝一般采用国产安卓手机或者山寨手机,或者借高利贷甚至更疯狂的屌丝卖肾脏也要买Iphone,坐公交车的时候不断打电话或者看短信,好让四邻的人瞧见自己的Iphone。穿打0.5折的假名牌,但假设看看假名牌上的价位表自信心立时爆表,吃泡面喝砖茶或路边巷口的小店,较为奢侈的消费则是肯德基、麦当劳或者加州牛肉面,偶尔去五回高档商店餐厅,会表现的矜持不安。发型一般为平头、碎发或低劣染发剂染过的奇形怪状的发型。屌丝在餐馆用餐总是躲在角落里,看表演坐在最终一排。生活中屌丝颓废、沉闷,要么表现的默不作声,要么歇斯底里的兴奋。

公海赌船网站 6

屌丝-屌丝心中的女神

 

     
 在心理方面,大部分屌丝没有女朋友,许多屌丝恋爱经历几乎是一片空白。即使是个别享有女友的屌丝,也不时因为无法知足女友物质需要而深感自卑,有时他们的女朋友也会由此而背叛心思。

      自身方面,很傻很天真。

     
屌丝的敌视阵营为“高富帅”和“白富美”,这一族群有着高背景、高身材,丰厚的老本底蕴对有些女性享有吸重力,恋爱容易得逞、事业也便于得逞。在屌丝看来,“黑木耳”和“白富美”往往沦为“高帅富”的玩具。

     
屌丝的小目的并未惊天动地到先挣特一个亿。屌丝总是期待工资高点、加班少点、讨厌
996、有时光出去旅旅游、买点自己喜爱的时装或者电子产品、偶尔搞点黑科技用来装装逼。偶尔做梦有个善良知性的
GF,娶了个不错美娇娘,YY在大都会毫无住老破小。
固然眼前依然有众多不如意,但屌丝总是靠着完成一个个的小目的,来激励着自己。时刻提示自己多一分努力,以后肯定多一分回报。屌丝也在默默努力着,他们也曾幻想自己就是某个故事里的男主角,扬鞭策马,指引江山;但也时时清醒的体味到梦太漫长,不如立马的面包和牛奶实在。屌丝的目的即便都不是太大,但也是值得人们刮目相看和认可的。正所谓,目标仍然要有些,说不定这天就兑现了呢。

【03 屌丝的热望】:


     
 1)屌丝渴望逆袭:“为何我老爸不是李嘉诚;为何自己如此帅,不过要掉头发,你多少个这样丑,却绝非掉头发!”

公海赌船网站 7

公海赌船网站 8

屌丝-屌丝渴望着逆袭

 

     
 这是少林足球里二师兄愤怒的独白,充足呈现了一个屌丝对天意不公的显眼控诉。比尔盖茨说过,上帝是不公道的。命运注定大部分人是屌丝,而你没法。大部分屌丝终其一生也超脱不了屌丝的生活。不过总有屌丝通过自我努力可以,机缘巧合也好,他们摆脱了草根寒门的身份,名誉财富地位都兼备了,走上人生巅峰!我们都惊奇他们是哪些形成,因为我们一致希望逆转!

     
2)屌丝希望赢取白富美:“原来如此,幸好自己思想缜密,一室不扫何以扫寰宇?这正是考验员工的底细,看本身怎样轻松应对。不用多长时间,我就会升职加薪、当上总主任、出任首席执行官、迎娶白富美、走上人生巅峰,想想还有点小震动!”

     
《万万没悟出》王大锤的这段YY段子,相信每一个响当当屌丝都应有丰裕熟识,甚至可以倒背如流,这句话之所以可以撼动无数屌丝的心尖,成为咱们贴在墙上时时诵读的座右铭,五行揣摸其中缘由大致也许仿佛好像似乎应该就是:这一句话道尽了大家屌丝对于逆转的精通渴望。

公海赌船网站 9

公海赌船网站 10

屌丝-梦想出任COO

 

     
 正所谓:真正的屌丝敢于直面惨淡的人生,不惧草根出身、不怕冷嘲热讽,叫板高富帅、挑衅伪精英、什么人横就灭何人、勇攀最高峰,屌丝逆转不是梦!

 

【04 屌丝偶尔的令人满意】:


 

吃泡面的那一刻(屌丝):

塑纸碗中,倒插着两根如玉卫生筷。

金黄面里,沉卧着一枚五毛黑卤蛋。

待半刻,热气腾腾,掀盖而闻。

鼻间飘蹿,满是红烧牛肉香。

唇齿启合,舌蕾似马达微震。

双筷紧撰,如拎提两杆长缨,戳入碗中,卷拉翻挑,似白雪扬头摆尾,搅的面汤波涛怒涌。

腕发力,面弹起,趁热,吐息。

张大嘴。

吸溜入口,滑滑嫩嫩。

耳畔余音,尽是仙子抚琴。

前边所见,无非人间仙境。

再看卤蛋,于碗中毕露莹光。

一口咬下,黄白皆碎,蛋香满溢。

于是乎大块朵颐,囫囵吞面,乃至汤不剩。

待此时,浑身酥软,不禁揉肚惊讶:

“妙哉,妙哉~”

公海赌船网站 11

公海赌船网站 12

屌丝-屌丝渴望的满足

 

三、怎么摆脱屌丝气质

 

【01 外表上摆脱屌丝】:


 心,放下自卑,包括自卑的自嘲。

脚,不要穿破破烂烂脏脏兮兮的鞋子

腿,不要穿垮垮的脏脏的破破的裤子(除非您大长腿)

脸,不要留“脏”胡子

头,不要杀马特

虽然近年来内涵还不够,少说话,多微笑。

公海赌船网站 13

公海赌船网站 14

屌丝-屌丝要把团结打造成男神

 

【02 不但摆脱还要装逼】:


     
穿上浴衣,叼上一根雪茄,整个人都放松下来,目光深邃地45度望向海外。在客人看来,你仿佛在记忆着成百上千万的大量生意,细细决断,举手投足间牵扯着商界的一场战火。

 

公海赌船网站 15

 屌丝-屌丝要学会装逼

 

公海赌船网站,【03 打破屌丝标签】:


   
  司汤达说:“我来自地狱,要去往天堂,正经过人间。”明天大家不谈我们来自哪儿,去往哪儿,就可以聊聊我们历经的这人间。这人间是那么周边却又渺小,宽广到能兼容形形色色的人在这人间生活,却又渺小到我们平时会觉得这世间只剩余自己,非常的孤单。这人间是那么热闹却又萧瑟,繁华到夜夜霓虹灯闪耀不停,却又萧瑟到连一片枯黄的叶子都留不住。这世间是所有人的江湖,这人间也是大家一个人的人间。没有人会获取永生,我们必然走向死亡,走向天堂。但大家真正只是要路过这世间吗?真的就只愿意成为一个人间过客吗?真的想永远打着一个“屌丝”的标签,在年老时变为一个老去的“屌丝”,在回老家后化作一个走向天堂的“屌丝”吗?我想大部分人都是不愿意的,所以咱们要不停大力,不断为温馨充电,打破“屌丝”标签,成为一个有内涵的人,得到一个有格调的人生。

公海赌船网站 16

公海赌船网站 17

屌丝-屌丝要让女神拜倒在您的背带裤下

 

四、写在最终–屌丝的逆袭

     
 装屌丝的人之中就不得不去提王思聪了,作为中华富家里面最能装屌丝一员。
笔者真的佩服这也是他乐乎粉丝过相对化的原因。网易上手撕范冰冰,向京东投诉物流太慢,嗤笑张兰跟自己家攀亲戚等等一文山会海的行事简直是一个屌丝想干却又没能力干的工作,既然他干了那么自己就去粉他,去拥护他。

公海赌船网站 18公海赌船网站 19

屌丝-思聪少爷也自称屌丝了

 

     
也正是他让我们精晓了她也是个屌丝,我们也是屌丝我们也能逆转。加油,屌丝终有逆转之日!

公海赌船网站 20

 

公海赌船网站 21

屌丝-屌丝终有逆转日,加油!

 

 

 

公海赌船网站 22

关心微信公众号

 

 

相关文章