会用到不一定记得的方法2

--分页标签一定要和pageHandel结合着用
<tbody id=defTblBdy>
<tr class="tr_pagenumber" height="25">
<td colspan="16">
<div style="display: none; text-align: right"><u:pagePanelAjax /></div>
</td>
</tr>
</tbody>

--根据开户行信息LOAD相应的银行
/**
* 根据开户行信息LOAD相应的银行
*  如果没有银行信息的话,则给出一个默认的银行"其他银行",ID为1,
* 是在初始化银行数据的时候添加进去的
*
* @param branch
* @return
*/
public Object[] loadBankByBranck(final List<Bank> banks,final String branch){}
bankAccountDaoImpl


--List集合排序的问题
List<Map.Entry<String, List<Object[]>>> oList = new ArrayList<Map.Entry<String,List<Object[]>>>(backBillMap.entrySet());
Collections.sort(oList, new Comparator<Map.Entry<String, List<Object[]>>>() {
@Override
public int compare(Entry<String, List<Object[]>> o1,
Entry<String, List<Object[]>> o2) {
return ((o2.getValue().size() > o1.getValue().size()) ? 1 : 0);
}});

/**
*
* 按List<Object[]>中Date类型元素排序
*
* @author liuhj
* @param listObj
* @param index 比较值在Object中对应下标
*/
public void sortObjDateForList(List<Object[]> listObj , final int index){
Collections.sort(listObj,new Comparator<Object[]>() {
public int compare(Object[] ob1, Object[] ob2) {
Calendar c1 = new GregorianCalendar();
Calendar c2 = new GregorianCalendar();
c1.setTime((Date)ob1[index]);
c2.setTime((Date)ob2[index]);
return CalendarUtils.compare(c1, c2);
}
});
}

--解决存进数据库没有时分秒的问题
1. 首先确定从数据库里面查出来的数据就是有时分秒的
TO_CHAR(p.assignTime,'").append(SQL_TIME_PATTER).append("') from cmcs3_payment_list p ");

2. 然后保证数据库的类型是timestamp的,

3. query.setTimestamp(5, new java.sql.Timestamp(((Date)vs[5]).getTime()));
给字段set值的时候

--编辑时候的方法,排除自己
public boolean isUniqueExceptSelf(BCDLWarn o) {
BCDLWarn warn = getBWarn(o.getAccountSet(), o.getBankName());
if(null != warn && warn.getId().longValue() != o.getId().longValue()) {
return false;
}
return true;
}

--点击查询后可以重新组一个grid的相关前台方法
result是从后台传过来的值,用^分隔

--后台的方法
StringBuilder head = new StringBuilder();
head.append("序号,退单类型,交易时间,所属银行,本方账号,借方金额,贷方金额,")
.append("用途,对方账号,对方户名,对方开户银行,单据流水号,单位编码,")
.append("凭证月份,凭证号,出纳,业务类型,报账单号,制证会计"); // 表头
StringBuilder width = new StringBuilder();
width.append("50,100,150,150,150,150,150,150,")
.append("150,150,120,100,100,120,120,100,100,100,150");
StringBuilder align = new StringBuilder();
align.append("center,left,center,left,left,right,")
.append("right,left,left,left,left,left,left,center,")
.append("left,left,left,center,center");
StringBuilder type = new StringBuilder();
type.append("ro,ro,ro,ro,ro,rmb,rmb,ro,")
.append("ro,ro,ro,ro,ro,ro,ro,ro,ro,ro,ro");

if(BackBillType.Back_Bill_Type_CODE_YHTP.equals(backBillType)) {
head.insert(0, "<input type=\"checkbox\" name=\"checkbox2\" id=\"checkbox2\" onclick=checkAll()>,");
width.insert(0, "50,");
align.insert(0, "center,");
type.insert(0, "ch8,");
}
this.write(response, head + "^" + width + "^" + align + "^" + type + "^" + xml.toString());

var result = originalRequest.responseText;
result = result.split("^");
$("chaxun").disabled = false;
mygrid.setImagePath("../imgs/");
mygrid.setHeader(result[0]); //表头
mygrid.setInitWidths(result[1]);
mygrid.setColAlign(result[2]);
mygrid.setColTypes(result[3]);

---分隔HQL语句,用from分隔
private String splitHql(String hql) {
StringBuffer temp = new StringBuffer();
String[] hqlParts = StringUtil.split(hql, "[ ][f|F][r|R][o|O][m|M][ ]");
int i = 0;
for (String part : hqlParts) {
if (i++ > 0) {
temp.append(" from " + part);
}
}
return temp.toString();
}

--获取支付单据验证码
BaseDispathAction getAuthNO方法
<think>嗯,用户问的是编译内核模块是否一定要用gcc-plugins,即使是最简单的一个printk的情况。首先,我需要回忆一下内核模块编译的基本流程和相关工具。 首先,内核模块的编译通常是通过Kbuild系统来处理的,也就是内核的构建系统。用户编写一个模块,一般会有对应的Makefile,里面指定了内核源代码的路径,然后使用make命令来编译。 接下来,GCC插件的作用是什么?我记得内核在编译时会使用一些GCC插件,比如用于堆栈初始化、结构体布局随机化之类的安全增强功能。这些插件通常是GCC的扩展,通过GCC的插件机制加载,以在编译过程中进行额外的检查或代码转换。 那问题来了,用户的情况是编译一个非常简单的模块,只有一个printk函数。这时候是否需要GCC插件呢?可能分情况。如果内核本身在构建时启用了GCC插件,那么在编译模块时是否也需要这些插件呢? 根据之前的知识,当编译内核模块时,模块的编译参数需要和内核本身编译时使用的参数一致,尤其是当内核使用了某些GCC插件的情况下。因为如果内核的某些数据结构或者函数被插件修改过,那么模块必须使用相同的插件来保证兼容性,否则可能会出现不匹配的问题,导致模块加载失败或者运行错误。 但是如果用户的内核在编译时没有启用任何GCC插件,那么在编译模块的时候自然不需要这些插件。这时候即使用户的模块很简单,也不需要GCC插件。但问题在于,很多现代的内核配置默认会启用某些安全相关的GCC插件,比如CONFIG_GCC_PLUGINS中的选项,比如STRUCTLEAK,STACKLEAK等。 所以需要分情况讨论: 1. 如果用户的内核在编译时启用了GCC插件,那么在编译模块时,必须使用相同的GCC插件,否则模块可能无法正确编译或者加载。 2. 如果内核编译时没有启用任何GCC插件,那么编译模块时也不需要,这时候即使是最简单的模块也不需要。 但是用户可能不知道他们的内核是否启用了GCC插件。这时候需要检查内核的配置,查看CONFIG_GCC_PLUGINS是否被设置。如果是的话,那么编译模块时必须传递相应的参数,让GCC加载这些插件。 此外,编译模块时使用的编译器版本和插件版本必须与编译内核时的一致,否则也会有问题。 那回到用户的问题,是否“一定”会用到GCC插件?答案是不一定,这取决于内核的配置。如果用户的内核没有启用GCC插件,那么编译模块时不需要。如果启用了,则必须使用。所以是否必须使用GCC插件,取决于内核本身的配置,而不是模块的复杂度。即使模块很简单,只要内核用了插件,编译模块时就必须用。 可能用户的情况是,他们尝试编译一个非常简单的模块,但遇到了关于GCC插件的错误,比如找不到某个插件,或者参数不正确。这时候需要检查内核配置,看看是否有相关插件被启用。 总结来说,内核模块编译是否需要GCC插件,取决于内核构建时的配置,而不是模块的复杂程度。因此,用户需要确认他们的内核是否启用了GCC插件,并确保在编译模块时正确传递这些参数。</think>编译内核模块是否必须使用GCC插件(`gcc-plugins`),取决于以下关键因素: --- ### **一、核心结论** **不一定需要**。即使是最简单的仅含`printk`的模块,是否需要GCC插件**完全由内核编译时的配置决定**: - 若内核编译时启用了GCC插件(如安全加固功能),则编译模块时**必须同步使用相同插件**。 - 若内核编译时未启用GCC插件,则编译模块时**无需额外插件**。 --- ### **二、关键分析步骤** #### 1. **GCC插件的作用** GCC插件用于实现内核安全增强功能,例如: - **STRUCTLEAK**(结构体成员自动初始化) - **STACKLEAK**(栈溢出防护) - **随机化结构体布局**(防止内存攻击) 这些功能通过修改编译器行为实现,因此**模块必须与内核使用相同的编译参数**。 #### 2. **内核配置检查** 通过以下命令查看内核是否启用了GCC插件: ```bash grep CONFIG_GCC_PLUGINS /boot/config-$(uname -r) ``` - 若输出包含`CONFIG_GCC_PLUGINS=y`,则**必须使用插件**。 - 若无相关输出或显示`=n`,则**无需插件**。 #### 3. **编译模块时的表现** - **情况1**:内核启用了GCC插件 直接编译简单模块会报错,例如: ``` fatal error: gcc-plugins/.../plugin_header.h: No such file or directory ``` 此时需在内核源码目录执行`make scripts prepare`,确保插件头文件生成。 - **情况2**:内核未启用GCC插件 即使模块仅含`printk`,编译流程仍正常完成。 --- ### **三、实际操作验证** #### 1. **编译最小化模块** 创建`hello.c`和`Makefile`: ```c // hello.c #include <linux/module.h> MODULE_LICENSE("GPL"); static int __init hello_init(void) { printk("Hello, kernel!\n"); return 0; } static void __exit hello_exit(void) {} module_init(hello_init); module_exit(hello_exit); ``` ```makefile # Makefile obj-m := hello.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build all: make -C $(KERNELDIR) M=$(PWD) modules clean: make -C $(KERNELDIR) M=$(PWD) clean ``` #### 2. **编译结果分析** - **成功**:若内核未启用插件,直接编译生成`.ko`文件。 - **失败**:若内核启用插件且未正确配置,需确保内核源码完整,并执行`make scripts prepare`。 --- ### **四、总结** | 内核配置状态 | 模块编译是否需要GCC插件 | 用户操作建议 | |---------------------|-------------------------|------------------------------| | 启用了GCC插件 | 是 | 确保内核源码完整并执行预处理 | | 未启用GCC插件 | 否 | 直接编译即可 | **最终结论**:是否需要GCC插件由内核配置决定,与模块复杂度无关。建议通过内核配置和编译日志确认实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值