1. linux c 符号的重定位信息
当编译器生成一个目标文件后,其并不知道代码和变量最终的存储位置,也不知道定义在其他文件中的外部符号。因此编译器会生成一个重定位表目,里面存储着关于每一个符号的信息。这个表目告知链接器在合并目标文件时应该如何修改每个目标文件中对符号的引用。这种重定位表目存储在.rel.text 段中和.rel.data 段中。该表目可以理解为一个结构体,其中存储着每一个符号的重定位信息。
offset表示该符号在存储的段中的偏移值。symbol 代表该符号的名称,字符串实际存储在.strtab 段中,这里存储的是该字符串首地址的下标。type表示重定位类型,链接器只关心两种类型,一种是与PC相关的重定位引用,另一种是绝对地址引用。
PC相关的重定位引用表示将当前的PC值(这个值通常是下一条指令的存储位置)加上该符号的偏移值。绝对地址引用表示将当前指令中已经指定的地址引用直接作为跳转的地址,不需要进行任何修改。
有了这些信息,链接器就可以将符号在存储段中的偏移值加上该段在重定位后该段的新地址,这样就得到了一个新的引用地址,而这个引用地址就是该符号的最终地址。同样,在程序所有引用该地址的部分都要作修改,使用这个新的绝对地址代替旧的偏移地址。当新的符号地址被修改完毕之后,链接器的工作就结束了。
2. 在Linux系统下运行C代码的问题(把好几个字符串合并为一个字符串)
s没有初始化,里面可能有随机内容。
声明时初始化
char s[50] = {0};
或者之后 memset(s, 0, sizeof(s));
试试。
另外 i 也需要初始化
3. 在linux系统中OC编程如何实现字符串连接
由于Xcode对中文支持良好,所以在开发过程中经常直接使用中文字符串。
不过苹果推荐多语言化,需要为中文字符串添加个NSLocalizedString宏。
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''''
Localization The Objective-C Code
@"..." --> NSLocalizedString(@"...", nil)
Jason Lee 2012-03-01
'''
import os, sys
import re
import codecs
targetPattern = pile('@"[^"]+"')
global newFile, newFilePointer
def isChineseCharacter(ch):
return0x4e00 <= ord(ch) <= 0x9fa5
def hasChineseCharacter(str):
for char in str:
if isChineseCharacter(char):
returnTrue
returnFalse
def buildNewString(oldStr):
newStrPrefix = 'NSLocalizedString('
newStrSuffix = ', nil)'
newStr = newStrPrefix + oldStr + newStrSuffix
return newStr
def processLine(line):
global newFile, newFilePointer
matchResult = targetPattern.findall(line)
for result in matchResult:
if hasChineseCharacter(result):
#print result, buildNewString(result)
p = pile(result)
line = p.sub(buildNewString(result), line)
newFilePointer.write(line)
def processFile(filename):
#Xcode file is saved with utf-8
global newFile, newFilePointer
newFile = 'Replaced.' + filename
newFilePointer = codecs.open(newFile, 'wb', 'utf-8')
fp = codecs.open(filename, 'rb', 'utf-8')
for line in fp:
processLine(line)
fp.close()
newFilePointer.close()
oldFile = 'Old.' + filename
os.system('mv ' + filename + ' ' + oldFile)
os.system('mv ' + newFile + ' ' + filename)
#os.system('rm -f ' + oldFile)
if __name__ == "__main__":
if len(sys.argv) > 1:
output = os.popen('ls ' + sys.argv[1]).read()
filelist = re.split('\n', output)
filelist = filelist[:-1]
#print filelist
print'Localizing...'
for file in filelist:
if os.path.exists(file):
try:
#print 'Processing File :', file
processFile(file)
except Exception as e:
print e
print'Localization Done.'
之后需要做的事情参考:
代码没用经过严格验证,请慎用。起码,没有检查该字符串是否已经加了NSLocalizedString宏。
4. Linux合并命令
当前目录下
cat A.txt b.txt > c.txt;rm -f A.txt b.txt
//-f 代表强制删除,不需要再做删除确认
5. linux c语言字符串连接函数
可以使用strcat()函数,函数原型char *strcat(char *dest,const char *src);函数说明:strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。返回值:返回参数dest的字符串起始地址。
例子:
#include<string.h>
main()
{
char a[30]="string1";
char b[]="string2";
printf("before strcat():%s\n",a);
printf("after strcat():%s\n",strcat(a,b));
}
执行结果:
before strcat():string1
after strcat():string1string2
6. Linux,已有A文本文件和B文本文件 将2文件的内容合并到C文件。在VI里写。
vi a将光标移动到最后一行,并添加一行在最后按ESC:r b按ESC:w c即可
7. 将m(1<=m<=10)个字符串连接起来,组成一个新串,放入pt所指存储区中.不能使用字符串连接函数.linux c 程序
char m = 1;
for( m=1; m<=10; m++) pt[m-1] = m-0x30;
pt[m] = 0x00;
8. 用C语言写一个函数,将两个字符串连接。
1、实际上就是实现strcat这个字符串库函数,在vc自带的crt源码或者linux平台的glibc库中都有strcat的源码,自己可以查阅参考,看看库开发者是如何写代码的,对于学习C语言非常有用。
2、示例
#include <stdio.h>
char *strcat(char *str1, char *str2)
{
if((str1==NULL)||(str2==NULL)) throw "Invalide arguments!";
char *pt = str1;
while(*str1!='\0') str1++;
while(*str2!='\0') *str1++ = *str2++;
*str1 = '\0';
return pt;
}
int main()
{
char a[]= "markyuan";
char b[]= "yyyyy";
char *cat = strcat(a,b);
printf("%s\n",cat);
return 0;
}
9. linux下c语言怎样把字符串与整数连接起来
用sprintf
charszBuff[16];
sprintf(szBuff,"%s%d","aaaa",i);
10. 我有两个问题: 1.linux,shell脚本可以调用c程序吗 2.通过网卡mac地址与硬盘序列号怎么确定一个唯一序列
1、Linux的shell调用C语言是一定的,就像你在脚本中使用 echo "helloworld" | passwd --stdin user001一样啊。echo本身就是一个C语言的可行的二进制的可执行文件。
2、通过mac地址和硬盘序列号确定一台机器是可行的,通过将二者组合(比如mac地址+硬盘序列号)后,通过散列算法是可以得到一个唯一的16位的序列,但是这种算法是存在风险的,比如我更换了硬盘,那么对已你的系统来说还是以前的机器呢?还有就是mac地址是唯一的,但是硬盘的序列号不一定唯一,貌似现在的硬盘没有一个统一的编号管理机构,都是硬盘厂商自己对硬盘编号。