前端-优雅的VueJS

Vue.js轻松实现页面后退时,还原滚动地点

前言 从Vue.js
2.x公告之后,陆陆续续做了七多个品类,摸索出来了一套自己的情况管理形式,我将之称为Vuet。它以规则来驱动状态更新,它拉动的是支付效能上的攀升,它就像草地,而你是野马,任您轻易驰骋,显而易见它是为快速开发而诞生。
缘由 在巨型的Vue应用程序开发中,多组件通信…

进阶 vue
全家桶


本项目可以看作一个前端 vue 进阶项目

哪些不用构建工具开发Vue全家桶项目


Vue是眼前最盛行的前端开发框架之一,与Vue-router和Vuex组成俗称的Vue全家桶,更是开发前端富交互使用的利器。配合webpack等构建工具,开发大型应用也得以一箭穿心。随着Vue的推广,可能有的老旧项目也期望能“渐进式”的使用Vue,或者部分序列想用Vue来做但不…

Vueg – 为 webApp 提供转场特效的开源 Vue
插件


假使您有利用 vue + vue-router 开发 web App、hybrid
App,这一个插件可以让您的 app 轻松取得页面切换时的转场特效。

Vue.js 学习连串二 —— vuex 学习实践笔记(附
DEMO)


本文介绍了笔者在攻读 vuex 过程中所获的经验,用简单的语言表达 vuex
的用法

Vuex2 与 Axios
开发


Vuex2 与 Axios 开发的这点事

应用 vue2+Vuex+Router 重写饿了么点餐系统和 vue
插件简析


风行写的 Demo,技术分享

按照Vue实现后台系统权限决定


用Vue这类双向绑定框架做后台系统再适合不过,后台系统相相比平日前端项目除外数据交互更频繁以外,还有一个特地的需求就是对用户的权杖控制,那么哪些在一个Vue应用中实现权力控制呢?下边是我的一点经历。
在权力的世界里服务端提供的一切都是资源,资源得以由请求方法+请求地址…

axios
全攻略


对 axios 官方文档举办了详实翻译,协理大家更好的通晓和采用 axios

依照 vue 开发的移位端 H5
积分商城项目


据悉 vue@1.0 开发的运动端 H5 积分商城项目
vue
vue-ruoter
vue-resource
webpack

vue2.0 transition — demo
实践填坑


vue1.0 版本和 2.0
版本的连结系统改变或者蛮彻底的,具体请自行详看文档介绍:https://vuefe.cn/v2/guide/migration.html\#
过渡。在行使 2.0 版本做衔接效果的时候,即便比 1.0
版本强大很多,不过执行进程中如故踩了一些不应有踩不过如故踩了的坑。即便官网文档已经很详细地介绍了各个应用场景,可是此地依然经过多少个小
demo 案例来感受下 vue2.0 transition 带来的有利吧!

一个 Vue.js+Node.js
的博客内容管理体系


一个后端 Node.js,数据库 mongoDB,前端 Vue.js 的博客内容管理连串。
包括了 vue-router, vue-resource, vuex 等。

Vux 2.0
发布


据悉 WeUI 和 Vue(2.x) 开发的运动端 UI 组件库,首要服务于微信页面

【vue+axios】一个品种学会前端实现登录拦截


一个序列学会 vue 全家桶 + axios 实现登录、拦截、登出效果,以及选择 axios
的 http 拦截器拦截请求和响应。

Vue2.0用户权限控制解决方案


Vue-Access-Control是一套基于Vue/Vue-Router/axios
实现的前端用户权限控制解决方案,通过对路由、视图、请求多个规模的支配,使开发者可以兑现任意颗粒度的用户权限控制。

Vue
服务端渲染业务入门实践


作者:威威(沪江前端开发工程师)

前不久, 产品同学一如既往笑哈哈的递来需求文档, 纵使内心万般拒绝,
身体倒是很老实。 接过要求,好在需求不复杂, 简单构思 后决定用 Vue,
百步穿杨。 切好图, 挽起袖子准备撸代码的时候, SEO
同学不知什么日期已经站到了背后。

“听说你要用 Vue?”
“恩…”
“SEO 考虑了吗? 整个 SPA 出来,网页的 SEO 咋做?”
“奥…”

换以前, 猜度只可以无可奈何的换个落实格局, 但是 Vue 2.0 时代的赶到,
给你多了一种可能。 你可以对 SEO 工程师说: 用 Vue 没问题!

Vue2.x
踩坑与总计


小结自己在攻读 vue 过程中相遇的题目

Vuex 实战:怎么样在广大 Vue 应用中团队 Vuex 代码 |
掘金技术征文


作者:滴滴公共前端团队 前言:
最早大家在统筹《Vue.js权威指南》这本书的时候也直接考虑要不要加盟 Vuex
相关的情节,也有很多校友埋怨说俺们并未投入这些章节。
其实全部我们运用的依然相比早,也在 1.0 和 2.*
都踩了部分坑,不过也不希望大家在此外复杂不复杂的面貌里…

Vue.js 学习序列四——Webpack
学习实践


要想学好 Vue 组件化开发,必先对 webpack 有丰盛的询问。

vue-cli#2.0
项目结构解析


接触过 vue 的同室应该都知情,用 vue-cli 开发 vue
的花色非常有益于,它能够帮你快捷构建一个颇具强大构建能力的 Vue.js
项目。明日不谈什么是 vue-cli,而是来说说用 vue-cli
构建的品类布局是何等的并分析部分文件。

AT – 前端 UI
组件库


AT-UI 是一款基于 Vue 2.x 的前端 UI 组件库,首要用来连忙支付 PC
网站产品。

vuex
探索之路


vuex 探索之路

Vue.js 学习体系三——axios
学习实践


正文介绍了 Vue 推荐网络通讯库 axios 的利用

以 Toast 为例讲解 Vue
组件的定义


  1. 单文件组件 平时支付时,我们项目文件夹平常都是使用 vue-cli 创立的,以
    单文件组件 的法门来协会代码的。遵照平常的支出流程,现在先创建一个
    Toast.vue 文件。 该器件有几个 prop : visible 与 msg。visible
    控制展现与潜伏,msg …
[Vue 脱坑记 -
查漏补缺(汇总下群里高频询问的xxx及给出不靠谱的解决方案)](https://link.jianshu.com?t=https%3A%2F%2Fjuejin.im%2Fentry%2F5a0188166fb9a045167c9a40)

对于以上三类人,走吧,那里不是您来装逼的地点.
你们也不值得看老子花那么多日子去汇总的水文.
学习一些新东西.如果有人给集中那么多问题(指明方向和肯定的化解格局).
这种景色一般报错音讯可以见到是哪些包抛出的音信.
一般卸载这些模块,安装重新安装下即可. 官方表达如下: dat…

一个依照vue2、koa2和mongodb的博客


博客终于差不多写完了,虽然仍然可能有一堆bug,
可是我急迅要写一篇博文来分享了= = 博客前台体现 博客前台显示博客后台体现 博客后台显示博客后台编辑 项目地址
github地址:https://github.com/BUPT-HJM/vue-blog
在线访问地址: …

用vue优雅地编写UI组件的几条指引规范


新近在品尝写多少个UI组件,并因此翻阅element-ui的源码,与其反复相比较,然后认真想想,最终总括出有些要好的一对体会和体会。在造轮子的经过中,既巩固了html,css,js基础,又强化了对vue源码的接头,更关键的是给了自我一个复习和实施所学过的设计形式和沉思的时机,来编排更…

vue + vuex +
directives实现权力按钮的思绪


对于这种问题,很显明不可能每个按钮都去判断,所以自己考虑了刹那间组合自定义指令和vuex完成了对应的实现。
vuex里面的showLogin这些action无非就是对login的显得隐藏flag的操作。
这里只是完成了简约的登陆权限决定,从登陆权限出发,可以投入更多的权杖决定,比如根…

VueJS
开发常见问题汇总


由于公司的前端着手倒车
VueJS,目前始发拔取这多少个框架举行支付,遭受有些题材记录下来,以备后用。
首要写一些 官方手册
上未曾写,可是实际上开支中会碰着的题目,需要肯定文化底子。
CLI: Vue-CLI UI: Element HTML: Pug(Jade) CSS: Les…

Weex
新官网


Weex Conf 在马斯喀特召开,活动中宣布了新的 Weex 官网及 Logo

前后端分离之路 – Vue2
项目多入口模板改造方案


做前后端分离也有一段时间了,需要提高一下门类多入口的构建方案到
Vue@2.x。项目模板没有选用重新开发,而是一直拔取了 vue 官方模板
vuejs-templates/webpack。现在我们需要把那些 SPA
单入口模板改成多入口,并且修改添加一些支出效益,以配合 Koa-grace
时的付出流程。

何以用 Vue
构建大型单页面应用


构建高性能,高可用的单页面应用

react都如此无情了,vue如故那么有义,4种父子组件数据双向传送大法


自定义事件可以用来创建自定义的表单输入组件,使用 v-model
来展开数量双向绑定。看看这一个:input v-model=”something”
这多少个大家一直用v-model像表单这样绑定就一贯可以展开父子组件双向绑定了。在v-model的语法糖里封装了v-on:input

Vue 2.0
服务端渲染怎么玩?


Vue 2.0
发表了也有一段时间了,新本子相比较大的更新就是支撑服务端渲染,目前悠闲折腾了下
Vue 的服务端渲染,记录下来。

Vue-router2.0
学习笔记


Vue.js
的一大特点就是构建单页面应用非凡利于,既然要有益于构建单页面应用那么自然少不了路由,vue-router
就是 vue 官方提供的一个路由框架。总体来说,vue-router
设计得简单好用,下边就来聊天自己其实用到过的片段方法。

BetterScroll:可能是现阶段最好用的活动端滚动插件


笔者:滴滴webapp架构组-付楠 BetterScroll
是一款重要解决移动端各种滚动场景需求的开源插件(GitHub地址),适用于滚动列表、采取器、轮播图、索引列表、开屏辅导等使用场景。
为了满意这一个场景,它不仅帮助惯性滚动、边界回弹、滚动条淡入淡出等功用的灵活安排,让滚动…

当 better-scroll 遇见
Vue


作者:滴滴公共前端 黄轶
在我们一般的位移端项目支付中,处理滚动列表是再常见可是的需求了。
以滴滴为例,可以是如此竖向滚动的列表,如图所示: 竖向列表
也足以是横向滚动的导航栏,如图所示: 横向列表 能够打开“微信 —>
钱包—>滴滴出行”体验效果。 我们在落实那类滚动效应的时…

手摸手,带你用vue撸后台
连串二(登录权限篇)


进入正题,做后台项目分别于做此外的档次,权限验证与安全性是可怜首要的,可以说是一个后台项目一先河就务须考虑和搭建的基本功要旨职能。大家所要做到的是:不同的权位对应着不同的路由,同时侧面栏也需依据不同的权限,异步转移。那里先简单说一下,我实现登录和权力验证的思路。
登录:当用户填写…

创制 Vue.js
可复用组件


从掩护视图到珍贵数据,Vue.js
让大家迅速地开发应用。但随着业务代码日益庞大,组件也越来越多,组件逻辑耦合严重,使代码维护变得分外困难。

同时,Vue.js
的接口和语法十分肆意,实现平等功效有若干种方法。每个人解决问题的思路不同等,写出来的代码也就不平等,缺乏社团内的正经。

正文目的在于从组件开发的两样方面列举出合理的缓解情势,作为树立组件规范的一个参阅。

Vue2
后台管理系列缓解方案


遵照 Vue.js 2.x 体系 + Element UI
的后台管理连串缓解方案。该方案作为一套多职能的后台框架模板,适用于多方的后台管理系列(Web
Management System)开发。

Vue2
全家桶与微信支付


动用 Vue 全家桶开发微信项目踩坑全经过以及经验总括

vue-lazy-render


Vue 组件, 用于 Vue 组件的延期渲染,
立异初次进入页面或者数据量较大的页面操作时出现卡顿的状态。

从一个改写后的 vue 小应用认识
vuex


源代码是 vuex1.0 写的,学习一段时间 vue 后用 vuex2.0
重新写了四回,让我们可以对照一下 vuex1.0 和 vuex2.0
的局部写法上的距离。

Vuex
通俗版教程


正文基本上是合法教程的盗版,用通俗易懂的文字讲解Vuex,也对初稿内容有删减。
假若您对上述注明不介意,那么就可以继续看本文,希望对您有所协理。
学习一个新技巧,必须要明了三个W,”What && Why”。 “XX
是怎么样?”,”为何要动用 XX ,或者说 XX 有什么样便宜…

Vuex
实战


最早我们在统筹《Vue.js 权威指南》那本书的时候也平昔思考要不要加盟 Vuex
相关的情节,也有很多同校抱怨说咱俩一贯不投入那么些章节。

深切NUXT,看看一条命令行的幕后到底暴发了何等


随着 react 社区的 next.js 框架的发布,vue
社区也毕竟诞生了属于自己的上下端同构框架
nuxt.js。在一发的接触与利用中,发现 nuxt.js 确实极大地便民了 vue
项目标开销,其背后的逻辑也值得大家欣赏。本文紧要研讨 nuxt
的运行原理,分析它从接受一条 nuxt
指令,到完成指令背后所发生的一多样工作。

Vue 2.0
构建单页应用最佳实战


前言 我们将会挑选拔取一些vue周边的库vue-cli,
vue-router,vue-resource,vuex
1.施用vue-cli创立项目2.运用vue-router实现单页路由3.用vuex管理我们的数据流4.行使vue-resource请求我们的node服务端5.使…

Vue 大型 SPA
项目标极品实践


这两年前端发展快捷,日新月异,各个框架层见迭出,这是一个坏时代,也是一个最好的时日,有幸的是可以身处在那么些时代去亲眼见证它、实践它。

vue中慎用style的scoped属性


谨慎运用不是并非,而是持一种审美的秋波去看待它。scoped肯定是解决了体制私有化的题目,但还要也引入了新的问题—样式不易(可)修改,而不少时候,大家是需要对国有组件的样式做微调的。所以自己才说要三思而行运用
首先要证实的题材是,最起先自我觉得那是一个BUG或者说一个弊端(因为当时…

VueX
填坑指南


Vuex 是一个专为 Vue.js
应用程序开发的意况管理情势。它接纳集中式存储管理应用的享有组件的情事,并以相应的条条框框保证状态以一种可预测的章程发生变化。

Vue.js 学习连串一 —— vue-router2 学习实践笔记(附
DEMO)


笔录了笔者在读书 vue-router 过程中的经验,并顺便学习 demo。

Vuex
通俗版教程


通俗易懂的 Vuex 简明教程

Vue-Blu 发布啦!基于 Vue2.x 和 Bulma 的 UI
组件库


Vue-Blu 是一款基于 Vue2.x 和 Bulma 的 UI 组件库。目前已有近 30 个零部件,
基本覆盖周边的面貌。后续也会不断完善和扩大。特点是基于 Bulma css
框架,本身装有了很好的布局和体制的功底、协理定制化、 API
友好、灵活。是前者快速支付的利器!

Vue
要旨之数据威胁


这篇小说讲解的是 Vue 框架中经过 Object.defineProperty()这些主意实现数量威迫的效率

一个货物 SKU 是怎么生成的(vue
实现)


一个货品 SKU 是怎么转移的

Vue.js
富文本编辑器


A wysiwyg editor written in Vue.js and Vuex.js, only support Vue.js
2.x.x

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给了我们帮忙。

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.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包)。

2.2 逐渐分析elf文件

  万事俱备了,开首分析elf文件,以第三节课project文件里demo工程为例。编译链接该工程可在D:\myProject\bsp\builds\demo\Release\Exe路径下拿到demo.elf文件。该文件大小32612
bytes,显著这样简单的一个小工程image
size不能这么大,表达elf文件里的记录信息数量占比很是大。

  第四、五节课里,豹哥已经给大家介绍了2种output文件,本文继续给大家讲project生成的另一种output文件-executable文件,也是特地重要的output文件。

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.1 解析工具readelf

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


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)。具体分析,各位朋友自己尝试看。

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

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>

  文件涉及:linker文件

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文件基础

  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;

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

工具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)文件豹哥便介绍完毕了,掌声在啥地方~~~

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

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

二、解析elf文件

  所谓工欲善其事,必先利其器,在开始解析elf文件往日,我们不可能不先找到一款适合的解析工具,readelf就是GNU/Linux官方推出的专用解析工具。有了这多少个分析工具,我们便足以逐步分析elf文件。

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是分外的。

工具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,待验证