c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量

零.C语言入口函数

从第一天学习C语言开始,我们的脑子里就深深烙下这样一个概念:C语言程序总是从main()函数开始执行,main()函数结束,程序也就结束了.在平时的练习中貌似这没有问题,但事实真的是这样吗?测试一下,

点击(此处)折叠或打开

#include

#include

#include

int enter(void)

{

printf("the start function!\n");

return 0;

}

编译:

打印处一页错误,其中有这样一条:

crt1.o:In function `__start':(.text+0x20): undefined reference to `main'

字面翻译就是:在函数_start中,main没有定义. __start函数是什么?main还要定义?crtl.o又是什么?带着疑问,我打开了百度.在其中搜到这样一份伪代码:

section .text:

__start:

:

init stack;

init heap;

open stdin;

open stdout;

open stderr;

:

push argv;

push argc;

call _main; (调用 main)

:

destory heap;

close stdin;

close stdout;

close stderr;

:

call __exit;

终于找到了,原来main就躲在crt1.o中,再看__start函数,"start"?不是开始的意思吗?难道每一个C程序就是从这开始的吗?

原来,对于“crt1.o”这个文件,其中crt是“C runtime library”的缩写,其含义是“C运时库”,C运行时库除了给我们提供必要的库函数调用(如memcpy、printf、malloc等)之外,它提供的另一个最重要的功能是为应用程序 添加启动函数。C运行时库启动函数的主要功能为 进行程序的初始化 ,对全局变量进行赋初值 ,加载用户程序的入口函数 。

soga,那这是不是意味着我们可以修改所要加载的入口函数呢?原来还有这样一条命令:

gcc *.c -e -nostartfiles

其中, *.c 为程序的源文件,-e为修改函数的入口地址,e == entrance ,后面的 就指明要替换的函数,-nostartfiles选项的作用是 通知编译器不自动加入启动函数以及别的库级别的初始化 ,这样就不会调用到crt1.o中的_start函数!测试一下,

点击(此处)折叠或打开

#include

#include

#include

int enter(void)

{

printf("the start function!\n");

return 0;

}

编译通过,运行:

the start function!

段错误 (核心已转储)

成功运行enter函数,但提示了段错误.

原来,在编译的时候加上了-nostartfiles这个选项的同时,使得最后的return语句不能正常执行。解决方案是,把程序最后的return语句改成exit()函数,因为return是将控制权交给调用函数,此时我们已经没有调用__start这个函数了,自然就没有enter的调用函数,然而exit()函数是将控制权交给内核,所以能够成功退出.

运行结果:

the start function!

一.LD_PRELOAD

在将LD_PRELOAD之前,我们先来了解一下两种链接方式

静态链接:由链接器在 链接时 将库的内容加入到可执行程序中.

动态链接:在可执行文件 装载时或运行时(注意与静态链接的区别) ,由操作系统的装载程序加载库.

通俗地讲,一种是无论程序运行与否,都加载库(静态库);另一种是只有执行到那一部分代码时,才加载库(动态库).

在Linux的动态链接库的世界中,LD_PRELOAD就是这样一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义 在程序运行前 优先加载的动态链接库 .这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数 .通过这个环境变量,我们可以 在主程序和其动态链接库的中间加载别的动态链接库 ,甚至覆盖正常的函数库.

说了这么多,是不是有点模糊?举个例子,

首先先编写一个“strcmp”函数,就将它命名为passwd.c

点击(此处)折叠或打开

#include

int strcmp(const char *str1,const char *str2)

{

puts(str1);

puts(str2);

return 0;

}

执行下面的语句:

gcc passwd.c -shared -o passwd.so -fPIC

其中,-shared选项的意思是将passwd.c编译链接成为一个动态库.*.so在Linux中为共享库——shared object,用于动态链接,和Windows下的dll差不多.

在shell中执行程序时,shell会提供一组环境变量.其中export的作用就是新增一个环境变量,供后续执行的程序使用.export的效力仅及于该此登陆操作.

对于-fPIC,-f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code),位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用.

然后,我们就用passwd.so这个库来进行优先替换:

export LD_PRELOAD=./passwd.so

我们知道,strcmp()的功能是比较两个字符串,但是在这里我们用passwd.so来代替系统的动态库,测试一下,

点击(此处)折叠或打开

#include

#include

#include

int main(int argc, char *argv[])

{

char *str = "abcdef";

char pass[10];

printf("Please input the passwd:\n");

gets(pass);

if( strcmp(pass,str) == 0 )

{

printf("Login succeed!\n");

}

else

{

printf("Passwd incorrect!\n");

exit(0);

}

return 0;

}

运行结果:

Please input the passwd:

123456

123456

abcdef

Login succeed!

就这样,strcmp()成功被我们替换了...

参考博文---------------------http://blog.sina.com.cn/s/blog_76a864e20101ehuz.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言字符串传给swift,如何把字符串数组从 Swift 传递给 C

作者:Natasha The Robot,原文链接,原文日期:2016-10-27译者:BigbigChai;校对:walkingway;定稿:CMBSwift 允许我们将原生的字符串直接传递给一个接受 C String(即 char *)…

c语言上机题库程序设计,C语言上机程序设计题库及答案.docx

C语言上机程序设计题库及答案C语言上机程序设计题库【程序设计】功能:根据整型形参m,计算如下公式的值:ysin(m)*10。【参考代码】 double y0; ysin(m)*10; return(y);功能:若x、y为奇数,求x到y之间的奇数和&#xff1b…

Android端发送字符到Wed端,android应用端向web端获取字符串。

一 发送和接收普通的JSONArray(仅仅包含字符串的数组)1)web端:PrintWriter out response.getWriter();ListorderAllList new USER().getListStr();JSONArray jsonArray JSONArray.fromObject(orderAllList);System.out.println("wowowo"jsonArray);whil…

three.js使用精灵模型Sprite渲染森林

效果&#xff1a; 源码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

android logcat 系统 分析,Android日志系统Logcat源代码简要分析

原文出处——>[Android日志系统Logcat源代码简要分析](http://blog.csdn.net/luoshengyang/article/details/6606957)在前面两篇文章Android日志系统驱动程序Logger源代码分析和Android应用程序框架层和系统运行库层日志系统源代码中&#xff0c;介绍了Android内核空间层、系…

android订阅管理,RXJAVA取消订阅封装-kotlin-Android

因为好几次自己想要在别的项目使用&#xff0c;每次都要重写一遍太麻烦&#xff0c;整理了一下发布到 jcenter 。利用官方lifecycle库与kotlin语言特性。lifecycle官方 support 27 自带。库代码数少于100行。用法&#xff1a;1、添加依赖implementation com.sjianjun:rxutils:1…

android 动画完成后不可点击事件,android – TranslateAnimation后按钮不可点击

点击后,我想移动按钮(带动画).我希望它在第一次点击时移动100个像素,底部移动100个像素,第二个100像素,第三个底部的100个像素,依此类推.我有简单的布局文件(main.xml)&#xff1a;android:id"id/button"android:layout_width"wrap_content"android:layout…

鸿蒙系统操作界面布局,华为鸿蒙操作系统大曝光

描述华为鸿蒙操作系统大曝光5月21日&#xff0c;华为消费者业务CEO余承东透露&#xff0c;面向下一代技术而设计的华为操作系统“鸿蒙”&#xff0c;最早将于今秋面市。而就在前天&#xff0c;环球时报(Global Times)发出推文表示&#xff1a;有消息人士称&#xff0c;华为正在…

android 高德获取省市,高德地图定位获取当前地址城市街道等详细信息(全部代码)...

自动定位后弹窗信息&#xff0c;包含省市县镇区路门牌号(效果图如下)代码↓↓↓获取地理位置var mapObj new AMap.Map(iCenter);mapObj.plugin(AMap.Geolocation, function () {geolocation new AMap.Geolocation({enableHighAccuracy: true, // 是否使用高精度定位&#xff…

nsq Android客户端,NSQ的golang客户端简单使用

NSQ的golang客户端简单使用NSQ 是由国外的一个短链服务商bitly使用golang开发的一个消息队列系统&#xff0c;正好使用到了这个东西&#xff0c;在这里简单的记录下。获取客户端nsq的golang客户端是官方版本的go get github.com/nsqio/go-nsq即可简单的消费者和生产者使用该客户…

鸿蒙系统新手教程,鸿蒙灭神决新手入门全流程图文攻略

鸿蒙灭神决新手入门全流程图文攻略2019-03-21 15:04:13来源&#xff1a;天天RPG编辑&#xff1a;野狐禅评论(0)中后期回归主题&#xff0c;如果还是打不过神器2&#xff0c;可以先到“中级挑战”这里完成第一排的四项挑战&#xff0c;可以获得四件道具。从这里开始由于我们刷木…

html中websocket获取数据,如何使用websocket从数据库中获取数据来刷新视图

在标准的Web交互中&#xff0c;客户端(即您的Web浏览器)向您的服务器发送请求。您的服务器收到请求&#xff0c;然后发送回您的浏览器中显示的信息&#xff0c;然后终止连接。WebSockets是一种在客户端和服务器之间创建持久&#xff0c;双向连接的方式&#xff0c;但它需要两者…

流内容html,为什么,和元素属于html中的流内容?

您在引用的部分中通常会忽略这个词.他们中的大多数确实包含文本,但并非所有文本都包含文本.其中一些,如< br>和< hr>您指出的元素不包含任何内容(因此不是typical个流内容元素).Most elements that are used in the body of documents and applications are catego…

html添加工具栏,添加带有命令的工具栏 (HTML)

添加带有命令的工具栏 (HTML)03/04/2016本文内容[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发&#xff0c;请参阅 最新文档 ]ToolBar 是一个简单的控件&#xff0c;用于解决命令扩展问题。它具有一个 …

用计算机解决问题 评课稿,总结反思:二年级数学lbrack;解决问题rsqb;评课稿

二年级数学《解决问题》评课稿二年级数学《解决问题》评课稿今天上午听了一节二年级数学上册用加减混合的常识《解决问题》的课&#xff0c;受益匪浅。我觉得这节课是顺利的&#xff0c;有待我们学习跟借鉴。雷老师虽未年过五旬&#xff0c;但他不服老的敬业精神&#xff0c;以…

计算机信息科学蔺泽浩,上海交通大学计算机科学与工程系(CSE)

脑机交互的多模态疲劳驾驶检测系统本系统通过获取驾驶员的脑电信号(EEG)、眼电信号(EOG)、握力信号和Kinect图像&#xff0c;从生理信号和行为特征中提取与疲劳相关的特征&#xff0c;利用机器学习方法建立疲劳检测模型&#xff0c;实现驾驶员疲劳状态的度量与预测。与传统的基…

分布式认知在计算机应用系统,人机交互作业

1. 人机交互过程中人们经常利用的感知有哪几种&#xff1f;每种感知有什么特点&#xff1f;视觉感知、听觉感知、触觉感知三种。1)视觉感知特点&#xff1a;一方面&#xff0c;眼睛和视觉系统的物理特性决定了人类无法看到某些事物&#xff1b;另一方面&#xff0c;视觉系统进行…

word计算机桌面加密,如何给电脑的Word文件加密

如何给电脑的Word文件加密Word文件是我们在工作和生活中会频繁使用到的&#xff0c;采用适当的方法给需要保护的Word文件加密&#xff0c;可以确保信息安全。这里所讲的加密&#xff0c;是指以某种特殊的方法改变原有的信息数据&#xff0c;使得未经授权的用户即使获得了已加密…

大学计算机一级b笔记,全国计算机等级一级B Excel考试整理笔记

Excel 计算题公式、图表全国计算机等级一级B Excel笔记整理Excel计算题目 2011 -12-5 1.求和&#xff1a;Sum()&#xff1b; 2.填写排列序号:rank; 计算时先输入“”&#xff0c;在加上函数,如”rank”&#xff1b; 3.求平均值&#xff1a;average; 4.求最大值&#xff1a;max;…

梦龙即时通讯软件测试初学者,梦龙即时通讯软件

现在办公都使用社交软件来进行沟通交流&#xff0c;省时省力。梦龙即时通讯软件集企业邮箱管理、日程管理、企业通讯录以及员工互动等功能于一体。能够帮助用户在日常使用中&#xff0c;得到一个高效的体验&#xff0c;有着丰富的办公功能&#xff0c;包括文件的传送&#xff0…