winger 发布的文章

用rust编写了一个dll给别的程序调用,但是因为之前是编译为i686-pc-windows-msvc目标。这样生成的文件对msvc运行库有所依赖,造成一些没有vc运行库的机器运行有问题。

于是打算编译为i686-pc-windows-gnu目标试试。在windwos下尝试指定目标为i686-pc-windows-gnu后,首先报找不到i686-w64-mingw32-gcc这个编译器。因为不想在windows下装cygwin再装MinGW-w64,所以决定转战linux。在linux下通过MinGW-w64交叉编译为windows的dll。

然而在linux下指定这个目标后,又报了一堆的错误。总结下来就是链接的时候,两个函数找不到链接的目标。分别是_Unwind_RaiseException与_Unwind_Resume。

网上翻找了一堆的方法后,通过添加编译参数“-C panic=abort”消除了_Unwind_RaiseException这个函数的链接。然而_Unwind_Resume这个链接怎么也没有办法解决。甚至有人已经下结论这个问题没法解决。

PS:如果指定为x86_64-pc-windows-gnu(64位)目标是没有问题的,但是项目要求必须是32位。

最后实在没有办法的时候,想了一个损招,自己实现并导出了一个叫_Unwind_Resume的方法……

#[cfg(target_arch = "x86")]
#[no_mangle]
pub extern "C" fn _Unwind_Resume() -> ! {
    panic!("call _Unwind_Resume function, so crash and burn!");
}

终于编译过去,因为没有异常处理,所以运行起来也暂时没什么问题。先这么凑合用吧。看以后官方会不会修复这个问题……

昨天发现,新创建的免费主机,却默认创建了非免费的引导卷。造成了对赠送的SGD扣款。

研究了跟我相同情况的一位朋友,和另外两位完全不扣费的同事的差异。终于发现了很大可能的情况。

在oracle试用帐号刚刚注册完成时,系统会提示正在配置帐号,配置完成后会发邮件通知。正常的两位同事都是在注册后很快就收到了提醒邮件,并正常登录后创建了免费主机。

而我和另一位朋友的情况是,迟迟没有收到邮件,并且在当天无法登录。在第二天还没有收到邮件的情况,尝试登录成功后,就在没有收到邮件的情况下创建免费主机。

在没有收到邮件的情况下登录,在系统中会提示帐号配置未完成,有部分功能无法使用。可能无法使用的功能就包括了免费引导卷。这种情况下创建的引导卷就不是永久免费的,也不会占用免费的200G免费额度。

新申请了一台oracle试用的免费主机。创建实例的时候,明确按照永久免费的范围设置。然而第二天却发现送的400 SGD发生了扣款。当时没有在意,又过了一天又产生了同样的扣款。这才好奇到底是哪里产生了费用。

通过计费查询功能,发现是Block Volume Storage与Block Volume Performance产生了费用。这就非常神奇了,因为我在块存储那边查看,并没有创建任何块存储。只有一个创建实例时,随实例自动创建的引导卷。

跟完全不扣费的同事创建的实例对比之后,终于发现他的实例上引导卷标记为永久免费,而我的引导卷却并没有!看来问题就出在这里,是这个引导卷产生了费用。

解决的办法就是把引导卷从实例中分离出来,编辑一下。引导卷就显示为永久免费了。再附加回实例上,启动实例。
目前看来并没有产生新的费用,具体再观察几天看看。

当通过http重定向到https协议访问Typecho站点时。Typecho默认会使用http协议加载资源。
而现在主流浏览器安全策略是不允许在https的链接中混合http资源。因此会导致资源加载失败。

所以需要强制Typecho所有资源全部为https协议。
方法是在文件根目录下的config.inc.php中添加以下配置:

define('__TYPECHO_SECURE__',true);