我在 2 年前使用 gcc 4.5 在 debian squeeze/stable 下创建了我的引导加载程序。现在在 debian wheezy/sid 中不能用 4.6 和 4.7 编译,因为从这些创建更大的部分我希望手工生成最终的二进制文件。现在这对我来说不是问题,因为在 debian wheezy/sid 中,gcc 4.5 仍然存在,但我希望可以使用 gcc 4.6 和 4.7 进行编译.
我像这样生成最终的二进制文件:
源文件编译为:
gcc-4.5 -Wall -O3 -c -m32 -I. -o assemblybin-objects/vga_pm.S.o vga_pm.S
链接到:
ld -nostdlib -T binary.ld assemblybin-objects/vga_pm.S.o ... and other objects here ... -o bootloader.bin
binary.ld 的内容是:
OUTPUT_FORMAT("binary","binary","binary")
OUTPUT_ARCH(i386)
SECTIONS
{
. = 0;
.bootloader : {
. = 0x600;
*(.bootstrap);
. = 0x7fa;
BYTE(0x11);
BYTE(0x33);
BYTE(0x55);
BYTE(0x77);
BYTE(0x55);
BYTE(0xaa);
_bootstrap_end = .;
. = 0x800;
*(.sysinit);
_sysinit_end = .;
. = 0x1000;
*(.pages);
_pages_end = .;
. = 0x5000;
*(.sysconf);
*(.presystem);
*(.system);
*(.library);
*(.text);
*(.data);
*(.bss);
*(.rodata);
*(.rodata.*);
. = 0xeffc;
BYTE(0x11);
BYTE(0x33);
BYTE(0x55);
BYTE(0x77);
_system_end = .;
}
. = ASSERT(_bootstrap_end <= 0x800,"Bootstrap section big!");
. = ASSERT(_sysinit_end <= 0x1000,"Sysinit section big!");
. = ASSERT(_pages_end <= 0x5000,"Pages section big!");
. = ASSERT(_system_end <= 0xf000,"System initialization section big!");
}
最后使用 dd 创建最终的二进制文件。
我看到当使用 gcc 4.6 和 4.7 编译时,链接器会在 bootloader.bin 的开头添加一些字节 (250-300)。
我正在使用 binutils 2.22 中的 ld 并使用我自己的构建过程食谱进行 cooking 。
我的实际问题是:
这些版本的 gcc 编译器之间有什么区别,它们产生更大的部分或通过 elf 目标文件指示链接器在 的开头添加这些字节bootloader.bin 文件?
gcc 4.6 和/或 4.7 是否有任何命令行参数将关闭可能产生比 gcc 4.5 或更大的部分的功能删除那些说链接器在 bootloader.bin 文件开头添加这些字节的说明?
编辑 17-08-2012:这些天我很忙,但很快我会更新我所做的测试结果。
@strnk 和@Dan Aloni 的回答:当我看到这个问题时,我首先做的是排除无用的部分,但结果是一样的......我想因为 bootloader.bin 是一个简单的二进制文件,在链接器指示的正确位置包含所需部分的链接代码,没有部分名称、重定位和调试信息和符号 ... bootloader.bin 文件不是 elf目标文件。
请考虑真题的变化。 谢谢你所做的一切......我很快就会回来
edit 31-08-2012:好的,伙计们,感谢您的帮助。 @Dan Aloni 给出的答案,并用 ldscript 完成,如 @strnk 所示
/DISCARD/ : {
*(.eh_frame)
*(.eh_frame_hdr)
}
断言之后。
最佳答案
通过在 gcc-4.5 和 gcc-4.6 之间使用您提供的标志编译一个简单的 C 文件,并使用 objdump -h要检查输出,.eh_frame 部分似乎是在 gcc-4.6 中引入的。
您提供的 ld 脚本不会处理该部分,但它可能应该处理。您可以使用 strip -R .eh_frame -R .eh_frame_hdr 在链接之前从对象文件中删除该部分和其他部分。
无论如何,由于两个 gcc 版本的链接器相同,目标文件上的 objdump -h 将提示导致此问题的差异。
关于linux - 我的引导加载程序不能用 gcc 4.6 和 4.7 编译...只有 4.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819906/
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我正在开发我的第一个Rubygem,并捆绑了cucumber、rspec和shoulda-matches进行测试。当我运行rspec时,出现以下错误:/app/my_gem/spec/spec_helper.rb:6:in`':undefinedmethod`configure'forShoulda::Matchers:Module(NoMethodError)这是我的gem规范:#my_gem.gemspec...Gem::Specification.newdo|spec|......spec.add_development_dependency"activemodel"spec.a