当前位置: 首页 > 编程日记 > 正文

汇编语言使用C库函数和Linux动态链接

使用printf


代码

#cpuid2.s -- Using C labrary calls  
.section .data  
output:          
.asciz "The processor Vender is '%s'\n"
.section .bss          
.lcomm buffer, 12  
.section .text  
.globl _start  
_start:          
movl $0, %eax          
cpuid          
movl $buffer, %edi          
movl %ebx, (%edi)   //含义同cpuid.s,向%edi所指向的buffer内存          
movl %edx, 4(%edi)  //位置写入3个寄存器的内容,这3个寄存器存储了          
movl %ecx, 8(%edi)  //CPU厂商信息的字符串(12字节)          
pushl $buffer       //将buffer和output入栈,为printf提供参数          
pushl $output          
call printf         //调用C的printf函数          
addl $8, %esp       //将堆栈指针回滚8个字节,达到清除printf参数的目的          
pushl $0          
call exit


.asciz是在定义字符串的时侯在字符串结尾加上空字符(即C语言的\0),这样做的目的是为了让printf能读懂字符串。

.lcomm是在本地内存区域中声明固定长度的未初始化数据,这里初始化了12个字节的空间。

程序里buffer和output内存位置的内容是要向printf传递的参数值:

一个是"The processor Vender is '%s'\n"字符串;

另外一个是由cpuid返回结果(在ebx,edx,ecx三个寄存器中)填充的buffer。


需要通过堆栈来传递参数,所以在程序中使用

pushl $buffer

pushl $output

将参数入栈,printf获取参数是自右向左,即先buffer后output,所以要把buffer后入栈。

参数入栈之后,用call指令调用printf。

exit的情况同上,使用了一个参数--常数0。


汇编

#as -o cpuid2.o cpuid2.s

采用了动态连接的方式,所以C函数没有包含在可执行程序中,需要由另外的程序在运行时加载,ld不知道这个程序在哪里,所以我们还得手动指定

动态链接

#ld -dynamic-linker /lib/ld-linux.so.2 -lc -o cpuid2 cpuid2.o

#./cpuid2

输出

The processor Vendor ID is 'GenuineIntel'

GDB调试

# gdb cpuid2  
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/zhms/AS/chap04/cpuid2...done.
(gdb) break _start
Breakpoint 1 at 0x80481b8: file cpuid2.s, line 10.
(gdb) r
Starting program: /usr/zhms/AS/chap04/cpuid2 
Breakpoint 1, _start () at cpuid2.s:10
10          movl $0, %eax
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6_3.6.i686
(gdb) i r
eax            0x0      0
ecx            0x0      0
edx            0x758470 7701616
ebx            0x767fc4 7765956
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80481b8        134513080
eip            0x80481b8        0x80481b8 <_start>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
11          cpuid
(gdb) i r
eax            0x0      0
ecx            0x0      0
edx            0x758470 7701616
ebx            0x767fc4 7765956
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80481b8        134513080
eip            0x80481bd        0x80481bd <_start+5>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
13          movl %ebx, (%edi)
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481c4        0x80481c4 <_start+12>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
14          movl %edx, 4(%edi)
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481c6        0x80481c6 <_start+14>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
15          movl %ecx, 8(%edi)
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481c9        0x80481c9 <_start+17>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
16          pushl $buffer
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481cc        0x80481cc <_start+20>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
17          pushl $output
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6bc       0xbffff6bc
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481d1        0x80481d1 <_start+25>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
18          call printf
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6b8       0xbffff6b8
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481d6        0x80481d6 <_start+30>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
0x007b63e0 in printf () from /lib/libc.so.6
(gdb) i r
eax            0x5      5
ecx            0x6c65746e       1818588270
edx            0x49656e69       1231384169
ebx            0x756e6547       1970169159
esp            0xbffff6b4       0xbffff6b4
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x7b63e0 0x7b63e0 <printf>
eflags         0x246    [ PF ZF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
Single stepping until exit from function printf,
which has no line number information.
The processor Vendor ID is 'GenuineIntel'
_start () at cpuid2.s:19
19          addl $8, %esp
(gdb) i r
eax            0x2a     42
ecx            0xbffff6a0       -1073744224
edx            0x8fe364 9429860
ebx            0x756e6547       1970169159
esp            0xbffff6b8       0xbffff6b8
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481db        0x80481db <_start+35>
eflags         0x286    [ PF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
20          pushl $0
(gdb) i r
eax            0x2a     42
ecx            0xbffff6a0       -1073744224
edx            0x8fe364 9429860
ebx            0x756e6547       1970169159
esp            0xbffff6c0       0xbffff6c0
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481de        0x80481de <_start+38>
eflags         0x296    [ PF AF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
21          call exit
(gdb) i r
eax            0x2a     42
ecx            0xbffff6a0       -1073744224
edx            0x8fe364 9429860
ebx            0x756e6547       1970169159
esp            0xbffff6bc       0xbffff6bc
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x80481e0        0x80481e0 <_start+40>
eflags         0x296    [ PF AF SF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
0x00799060 in exit () from /lib/libc.so.6
(gdb) i r
eax            0x2a     42
ecx            0xbffff6a0       -1073744224
edx            0x8fe364 9429860
ebx            0x756e6547       1970169159
esp            0xbffff6b8       0xbffff6b8
ebp            0x0      0x0
esi            0xbffff6cc       -1073744180
edi            0x80492c0        134517440
eip            0x799060 0x799060 <exit>
eflags         0x246    [ PF ZF IF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) s
Single stepping until exit from function exit,
which has no line number information.
Program exited normally.
(gdb) i r
The program has no registers now.
(gdb) 


ld-linux.so查找共享库的顺序

这里引出一个问题,怎么知道ld-linux.so.2是什么以及定位

Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同。可以用ldd查看:

#ldd /bin/cat

最后一个没有=>的就是。其中第一个不是实际的库文件,你是找不到的,它是一个虚拟库文件用于和kernel交互。
ld-linux.so是专门负责寻找库文件的库。以cat为例,cat首先告诉ld-linux.so它需要libc.so.6这个库文件,ld-linux.so将按一定顺序找到libc.so.6库再给cat调用。
那ld-linux.so又是怎么找到的呢?其实不用找,ld-linux.so的位置是写死在程序中的,gcc在编译程序时就写死在里面了。Gcc写到程序中ld-linux.so的位置是可以改变的,通过修改gcc的spec文件。

运行时,ld-linux.so查找共享库的顺序
(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
(3)LD_LIBRARY_PATH环境变量中所设定的路径
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中

编译时,ld-linux.so查找共享库的顺序
(1)ld-linux.so.6由gcc的spec文件中所设定
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
(4)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)
(5)二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin
(6)编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include


用 Linux 进行动态链接

ELF映像

Linux 中的动态链接的共享库的过程。当用户启动一个应用程序时,它们正在调用一个可执行和链接格式(Executable and Linking Format,ELF)映像。内核首先将 ELF 映像加载到用户空间虚拟内存中。然后内核会注意到一个称为 .interp 的 ELF 部分,它指明了将要被使用的动态链接器(例如:/lib/ld-linux.so)。


一个ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况。sections保存着object 文件的信息,从连接角度看:包括指令,数据,符号表,重定位信息等等。

使用 readelf 来显示程序标题

#readelf -l cpuid2

注意,ld-linux.so 本身就是一个 ELF 共享库,但它是静态编译的并且不具备共享库依赖项。当需要动态链接时,内核会引导动态链接(ELF 解释器),该链接首先会初始化自身,然后加载指定的共享对象(已加载则不必)。接着它会执行必要的再定位,包括目标共享对象所使用的共享对象。


#readelf -l cpuid2.o

There are no program headers in this file.


ldd命令

Linux 提供了很多种查看和解析 ELF 对象(包括共享库)的工具。其中最有用的一个当属 ldd命令,可以使用它来发现共享库依赖项

#ldd cpuid2

ldd所告诉您的是:该 ELF 映像依赖于 linux-gate.so(一个特殊的共享对象,它处理系统调用,它在文件系统中无关联文件),GNU C库(libc.so)以及 Linux 动态加载器(因为它里面有共享库依赖项)。


#ldd cpuid2.o

ldd: 警告: 你没有执行权限 `./cpuid2.o'
不是动态可执行文件


readelf识别对象内可再定位的C库

readelf 命令是一个有很多特性的实用程序,它让您能够解析和读取 ELF 对象。readelf 有一个有趣的用途,就是用来识别对象内可再定位的项。对于我们这个简单的程序来说,可以看到需要再定位的符号

#readelf -r cpuid2

从这个列表中,您可以看到各种各样的需要再定位(到 libc.so)的 C库调用。


#readelf -r cpuid2.o



readelf查看共享库的依赖库(NEEDED)和搜索名(SONAME)

#readelf -d cpuid2


#readelf -d cpuid2.o

无输出


readelf查看ELF头信息

#readelf -h cpuid2


#readelf -h cpuid2.o


附录

#man readelf

objdump

objdump是用查看目标文件或者可执行的目标文件的构成的GCC工具


反汇编

#objdump -d cpuid2

对于其中的反汇编代码

左边是机器指令的字节,右边是反汇编结果。显然,所有的符号都被替换成地址了, 注意没有加$的数表示内存地址,而不表示立即数。


objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 <可查到该文件的所有动态库>
objdump -t obj 输出目标文件的符号表()
objdump -h obj 输出目标文件的所有段概括()
objdump -j .text/.data -S obj 输出指定段的信息,大概就是反汇编源代码把
objdump -S obj C语言与汇编语言同时显示


更多参考

#man objdump

参考:Linux 动态库剖析

http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/

相关文章:

springJDBC实现查询方法二

无废话&#xff0c;看代码&#xff1a; Overridepublic List<Sites> queryAllSites(Pager pager) {String sql "select * from sakai_site order by SITE_ID limit ?,?";Object[] obj new Object[]{pager.getStart(),pager.getLimit()};List<Sites> …

全球计算机视觉顶会CVPR 2020论文出炉:腾讯优图17篇论文入选

全球计算机视觉顶级会议CVPR2020 (IEEE Conference on Computer Vision and Pattern Recognition&#xff0c;即IEEE国际计算机视觉与模式识别会议) 即将于2020年6月14日-19日在美国西雅图召开。本届大会总共录取来自全球论文1470篇&#xff0c;腾讯优图实验室入选17篇。 作为…

gcc使用总结

1.基本选项 -o 指定输出文件名。如果不给出这个选项&#xff0c;gcc就给出预设的可执行文件a.out。 # cc -o XX XX.c -c 编译、汇编到目标代码&#xff0c;不进行链接 -v 打印较多信息&#xff0c;显示编译器调用的程序。 -E 仅作预处理&#xff0c;不进行编译、汇编…

websecurity - Web Security Testing Framework 超级牛B扫描器

Windows – Websecurify 0.3.exehttp://websecurify.googlecode.com/files/Websecurify%200.3.exeLinux – Websecurify 0.3.tgzhttp://websecurify.googlecode.com/files/Websecurify%200.3.tgzMac – Websecurify 0.3.dmghttp://websecurify.googlecode.com/files/Websecurif…

C中的qsort函数和C++中的sort函数的理解与使用

一、qsort()函数 原型&#xff1a;_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); 参数解释&#xff1a;1、待排序数组首地址&#xff1b;2、数组中待排序元素数量&#xff1b;3、各元素的占用空间的大小&#xff1b;4、指向函数的指…

机器学习新闻综述:2019年AI领域不得不看的6篇文章

作者 | Limarc Ambalina翻译 | 火火酱&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;在这篇机器学习新闻综述中&#xff0c;我们将回顾一些2019年以来在人工智能各个领域广泛传播或产生影响的重大新闻。此外&#xff0c;我们还将…

GDB attach到进程

要调试守护进程等已经启动的进程或是调试陷于死循环的进程可以使用attach命令 格式 attach pid C语言代码 #include <stdio.h> int main(void) { int marks[10]; int i; for(i0;i<12;i) { scanf("%d",&marks[i]); …

Chrome使用技巧和编辑框拖动怪问题。

常用快捷键&#xff1a;ctrlshiftt 重新打开刚关闭的网页ctrlh 打开历史记录ctrl 放大。ShiftEscape 查看任务管理器据说Chrome能调整编辑区大小&#xff0c;我没发现。倒发现Chrome一个问题&#xff0c;选中编辑框中的文字&#xff0c;一直拖动鼠标&a…

Linux中断研究

2019独角兽企业重金招聘Python工程师标准>>> 研究linux系统&#xff0c;不管是做驱动、协议栈还是进程调度等等&#xff0c;都离不开中断。这说明&#xff0c;要想编写正确的linux代码&#xff0c;不了解中断是不行的。 话说曾几何时&#xff0c;在大学的课堂里&…

linux环境内存分配原理

Linux的虚拟内存管理有几个关键概念&#xff1a; Linux 虚拟地址空间如何分布&#xff1f;malloc和free是如何分配和释放内存&#xff1f;如何查看堆内内存的碎片情况&#xff1f;既然堆内内存brk和sbrk不能直接释放&#xff0c;为什么不全部使用 mmap 来分配&#xff0c;munm…

大脑芯片公司Neuralink计划在人脑内植入芯片,他们到底想干什么?

作者 | James Murphy翻译 | 火火酱&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;说实话&#xff0c;科幻电影在遇到Neuralink时也不得不甘拜下风。2019年7月&#xff0c;埃隆马斯克(Elon Musk)宣布&#xff0c;他的公司正在研发…

判断链表是否存在环(及其延伸)

有一个单链表&#xff0c;其中可能有一个环&#xff0c;也就是某个节点的next指向的是链表中在它之前的节点&#xff0c;这样在链表的尾部形成一环。问题&#xff1a;1、如何判断一个链表是不是这类链表&#xff1f;2、如果链表为存在环&#xff0c;如果找到环的入口点&#xf…

iOS跳转到各种系统设置界面

定位服务 定位服务有很多APP都有&#xff0c;如果用户关闭了定位&#xff0c;那么&#xff0c;我们在APP里面可以提示用户打开定位服务。点击到设置界面设置&#xff0c;直接跳到定位服务设置界面。代码如下&#xff1a; //定位服务设置界面 NSURL *url [NSURL URLWithString:…

Linux内存管理大图(第三稿)

网友画的还不错就转了 &#xff0c;该作者一共画了3版 v0.1 v0.2 v0.3 原文地址&#xff1a;http://bbs.chinaunix.net/thread-2018659-1-1.html

VNC的安装与使用

VNC的安装与使用。 说明&#xff1a;文章内容比较简单&#xff0c;献给那些初学者作为参考。 文章分为两部分&#xff0c;第一部分为VNC简介&#xff0c;第二部分为VNC的安装与使用。 文章为小弟结合书籍与小弟的实际操作总结出来的&#xff0c;如有错误与疏漏之处…

百度「AI战疫」:首次开源肺炎CT影像分析AI模型,让诊断从分钟到秒

自疫情爆发以来&#xff0c;多家科技公司纷纷加入了抗击疫情的战役中。 其中&#xff0c;排查疫情是这场战役的重中之重&#xff0c;而 CT 影像已成为新冠肺炎筛查和病情诊疗的重要依据。 然而&#xff0c;在当前疫情诊疗的关键时期&#xff0c;存量患者和新增患者总体数量庞…

Linux_DNS服务器

目录 目录DNS DNS ServerServerSite Master DNS ServerForward DomainReverse Resolution Slave DNS ServerForward lookupReverse lookupSplit DNS ServerDNS DNS(Domain Name System&#xff0c;域名系统)&#xff0c;在Internet上作为域名和IP地址映射的一个分布式数据库&am…

多场景下的AI疫情防控“天网”:解读云边端联动下的全栈AI技术

在全民抗疫的特殊时期下&#xff0c;伴随着春运返潮&#xff0c;企业陆续复工&#xff0c;从重点防控的机场、火车站等场所&#xff0c;到学校、企业、社区等密集型场所&#xff0c;都是不能忽视的地点。除了人工逐一测量体温排查外&#xff0c;我们还发现&#xff0c;在人员复…

DHCP配置与DHCP中继代理2

实验二&#xff1a;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Step1、配置DHCP中继代理1) 打开“管理工具”→“路由和远程访问”窗口&#xff0c;启用路由和远程访问&#xff0c;按向导提示完成操作。<?xml:namespac…

查看CPU是i386架构和x86_64架构

查看处理器是32位还是64位 #cat /proc/cpuinfo 检查flags行中有没有lm标记&#xff0c;lm是Long Mode的简写&#xff0c;表示支持64位模式。 #getconf LONG_BIT 输出&#xff1a;32 #getconf WORD_BIT 输出&#xff1a;32 32位的系统中int类型和long类型一般都是4字节&…

malloc一次性最大能申请多大内存空间

受用户态内存地址空间的限制。64 位系统下分配几个 T 不成问题。 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。作者&#xff1a;zz matrix链接&#xff1a;http://www.zhihu.com/question/20836462/answer/22833295来源&#xff1a;知乎考…

MD5算法之C#程序

MD5算法比较特别&#xff0c;最适合用汇编语言来写&#xff0c;好多高级语言对之无能无力或效率极低。 比如我最开始尝试用Python和Euphoria编写&#xff0c;发现不太容易。相比而言&#xff0c;C#作为C家簇 中新兴的一门.net语言&#xff0c;功能比较全面。花了一晚上的工夫终…

unix环境汇编语言常用工具

汇编器 MASM&#xff1a;微软的汇编器不支持unix NASM&#xff1a;unix环境下兼容微软平台 GAS&#xff1a;GNU 的免费软件包&#xff0c;unix环境下最流行跨平台汇编器 安装GNU汇编器 检查binunits RedHat #rpm -qa |grep binunits Debian #dpkg -l|grep binunit 下载地…

用Python远程登陆服务器的最佳实践

来源 | Python编程时光&#xff08;ID: Cool-Python&#xff09;在使用 Python 写一些脚本的时候&#xff0c;在某些情况下&#xff0c;我们需要频繁登陆远程服务去执行一次命令&#xff0c;并返回一些结果。在 shell 环境中&#xff0c;我们是这样子做的。$ sshpass -p ${pass…

Exchange Server 2013 LAB Part 4.内部客户端访问

关于Exchange服务器内部客户端访问的更详细介绍&#xff0c;请参考Exchange Server 2010链接&#xff1a;http://xutonglin.blog.51cto.com/8549515/1390715每个组织在AD林中都至少有一台客户端访问服务器和一台邮箱服务器。另外&#xff0c;每个AD站点中都必须至少有一台客户端…

VirtualBox安装64位Linux

VirturlBox安装64位的Linux 原因 virtualbox 本身不带 64 位支持&#xff0c;它的 64 位支持依赖于通过cpu虚拟技术把cpu的64位指令直接映射过去。 所以&#xff0c;要支持64位必须&#xff1a; 1.你的cpu支持64位。 2.你的cpu支持虚拟化&#xff0c;并且你的bios支持把cpu虚…

6个步骤,告诉你如何用树莓派和机器学习DIY一个车牌识别器!(附详细分析)...

作者 | Robert Lucian Chiriac翻译 | 天道酬勤&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;几个月前&#xff0c;作者开始考虑让汽车能够具备检测和识别物体的能力。他很喜欢这个主意&#xff0c;因为已经见识到了特斯拉的能力…

推荐bpython

可能很多人都对ipython比较熟悉&#xff0c;但是我这里要推荐的是bpython&#xff0c;我发现用起来更加顺手。详细的信息可以从其官方网站上获得。下面介绍几个主要的feature&#xff08;使用系统为Linux&#xff09;&#xff1a;1. 语法高亮&#xff1a;2. 自动提示&#xff0…

几个定制 iTerm2 的 tip

重装 Mac 才想起来很多配置没有备份过, 找起来麻烦, 所以记一下 按文本开头搜索命令 一个是 Bash 里按上下键直接查找历史, 匹配开头相同的内容最开始是我朋友在 Matlab 下用到提到想要这个方案, 一起找了结果真有于是记录一下配置: ➤➤ cat ~/.inputrc "\e[A":hist…

从1的补码说起计算机的数制

字节换算 bit(b)位 字节(byte)8位 -128~127 0&#xff5e;255 半字2字节16位 -32768~32767 0&#xff5e;65,535 字(word)4字节32位 -2147483848~2147483647 0&#xff5e;4,294,967,295 双字8字节64位 -9223372036854775808~9223372036854775807 0&#xff5e;18,446,744…