Error[8]: Undefined offset: 3, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0): .global _start ; notice on entry here, all regs but %esp are zero_start: call .L0 ; offset == strlen, provided by you 以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0):

.global _start             ; notice on entry here,all regs but %esp are zero_start:    call  .L0              ; offset == strlen,provIDed by your assembler.byte 'H','e','l','o',',' ','W','r','d'.L0:    pop   %ecx             ; ret addr is starting addr of string    mov   -4(%ecx),%edx    ; argument to `call`,4 bytes: strlen    inc   %ebx             ; stdout == 1    movb  ,%al          ; SYS_write == 4    int   
.global _start_start:    movb  ,%al    inc   %ebx    mov   $.L0,%ecx       ; this address is calculated when linking    movb  $.Lend-.L0,%dl  ; strlen,calculated by assembler    int   
int main(int argc,char **argv){    puts("Hello,World");    exit(0); /* or whatever code */}
x80 xchg %eax,%ebx int %0x80.L0:.byte 'H','d'.Lend:
x80 xchg %eax,%ebp ; %ebp is still zero xchg %eax,%ebx ; SYS_exit == 1,return value == 0 int [+++]x80

如果一个人愿意牺牲位置独立性(相反,强制链接器插入字符串地址),而不关心程序返回零,可以将其归结为:

[+++]

这两个都可以通过-32 -o x.o x.S组装/链接; ld -s -m elf_i386 x.o,运行得很好.第二个是26字节的代码.如果您在打印Hello,World之后允许崩溃,则将最后两条指令保留为23字节.那是我能走的最低点.

一直困扰着我的问题,是否有可能从中挤出几个字节?对我的纯粹猜测给出了这些可能的线索:

>以某种方式使用’Hello,World’部分作为代码?
>任何人都知道一个可用的系统调用复活节彩蛋?
>欺骗链接器使入口点成为一个16位地址,以便可以使用movw $.L0,%cx(保存一个字节)?
>对已知(或通过汇编程序/链接器调用魔术创建)的位置执行8位偏移jmp,以包含退出(…)系统调用的必要指令,在xchg上保存一个字节; int序列?

或者,可以证明这实际上是最小的表现良好(没有崩溃/返回代码为零)linux / x86“Hello,World”?

编辑

澄清一下,问题不在于最小化ELF可执行文件的大小;这方面的技术是众所周知的.我明确询问linux 32位x86汇编程序的大小,该程序执行的编译代码与以下代码相同:

[+++]

会做.
事实上,我会对任何不需要手动编辑ELF标题的事情感到高兴.如果你找到了一种方法,例如将“Hello,World”填入某个ELF对象并从汇编源引用它,仅使用汇编程序/链接器命令行和/或mapfile输入,我认为它足够有效,即使这增加了它的大小ELF可执行文件.我只想知道打印“Hello,World”和exit()之后的指令序列是否可以缩小.
问题是关于代码大小,而不是可执行文件大小.

解决方法 这是在1999年完成的.看看 this page(剧透:最终结果是一个45字节的ELF文件).一定要阅读 the postscript. 总结

以上是内存溢出为你收集整理的这个Linux / 32bit x86组件“Hello,World”能否做得更小?全部内容,希望文章能够帮你解决这个Linux / 32bit x86组件“Hello,World”能否做得更小?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0): .global _start ; notice on entry here, all regs but %esp are zero_start: call .L0 ; offset == strlen, provided by you 以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0):

.global _start             ; notice on entry here,all regs but %esp are zero_start:    call  .L0              ; offset == strlen,provIDed by your assembler.byte 'H','e','l','o',',' ','W','r','d'.L0:    pop   %ecx             ; ret addr is starting addr of string    mov   -4(%ecx),%edx    ; argument to `call`,4 bytes: strlen    inc   %ebx             ; stdout == 1    movb  ,%al          ; SYS_write == 4    int   
.global _start_start:    movb  ,%al    inc   %ebx    mov   $.L0,%ecx       ; this address is calculated when linking    movb  $.Lend-.L0,%dl  ; strlen,calculated by assembler    int   
int main(int argc,char **argv){    puts("Hello,World");    exit(0); /* or whatever code */}
x80 xchg %eax,%ebx int %0x80.L0:.byte 'H','d'.Lend:
x80 xchg %eax,%ebp ; %ebp is still zero xchg %eax,%ebx ; SYS_exit == 1,return value == 0 int x80

如果一个人愿意牺牲位置独立性(相反,强制链接器插入字符串地址),而不关心程序返回零,可以将其归结为:

[+++]

这两个都可以通过-32 -o x.o x.S组装/链接; ld -s -m elf_i386 x.o,运行得很好.第二个是26字节的代码.如果您在打印Hello,World之后允许崩溃,则将最后两条指令保留为23字节.那是我能走的最低点.

一直困扰着我的问题,是否有可能从中挤出几个字节?对我的纯粹猜测给出了这些可能的线索:

>以某种方式使用’Hello,World’部分作为代码?
>任何人都知道一个可用的系统调用复活节彩蛋?
>欺骗链接器使入口点成为一个16位地址,以便可以使用movw $.L0,%cx(保存一个字节)?
>对已知(或通过汇编程序/链接器调用魔术创建)的位置执行8位偏移jmp,以包含退出(…)系统调用的必要指令,在xchg上保存一个字节; int序列?

或者,可以证明这实际上是最小的表现良好(没有崩溃/返回代码为零)linux / x86“Hello,World”?

编辑

澄清一下,问题不在于最小化ELF可执行文件的大小;这方面的技术是众所周知的.我明确询问linux 32位x86汇编程序的大小,该程序执行的编译代码与以下代码相同:

[+++]

会做.
事实上,我会对任何不需要手动编辑ELF标题的事情感到高兴.如果你找到了一种方法,例如将“Hello,World”填入某个ELF对象并从汇编源引用它,仅使用汇编程序/链接器命令行和/或mapfile输入,我认为它足够有效,即使这增加了它的大小ELF可执行文件.我只想知道打印“Hello,World”和exit()之后的指令序列是否可以缩小.
问题是关于代码大小,而不是可执行文件大小.

解决方法 这是在1999年完成的.看看 this page(剧透:最终结果是一个45字节的ELF文件).一定要阅读 the postscript. 总结

以上是内存溢出为你收集整理的这个Linux / 32bit x86组件“Hello,World”能否做得更小?全部内容,希望文章能够帮你解决这个Linux / 32bit x86组件“Hello,World”能否做得更小?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 5, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0): .global _start ; notice on entry here, all regs but %esp are zero_start: call .L0 ; offset == strlen, provided by you 以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0):

.global _start             ; notice on entry here,all regs but %esp are zero_start:    call  .L0              ; offset == strlen,provIDed by your assembler.byte 'H','e','l','o',',' ','W','r','d'.L0:    pop   %ecx             ; ret addr is starting addr of string    mov   -4(%ecx),%edx    ; argument to `call`,4 bytes: strlen    inc   %ebx             ; stdout == 1    movb  ,%al          ; SYS_write == 4    int   
.global _start_start:    movb  ,%al    inc   %ebx    mov   $.L0,%ecx       ; this address is calculated when linking    movb  $.Lend-.L0,%dl  ; strlen,calculated by assembler    int   
int main(int argc,char **argv){    puts("Hello,World");    exit(0); /* or whatever code */}
x80 xchg %eax,%ebx int %0x80.L0:.byte 'H','d'.Lend:
x80 xchg %eax,%ebp ; %ebp is still zero xchg %eax,%ebx ; SYS_exit == 1,return value == 0 int x80

如果一个人愿意牺牲位置独立性(相反,强制链接器插入字符串地址),而不关心程序返回零,可以将其归结为:

这两个都可以通过-32 -o x.o x.S组装/链接; ld -s -m elf_i386 x.o,运行得很好.第二个是26字节的代码.如果您在打印Hello,World之后允许崩溃,则将最后两条指令保留为23字节.那是我能走的最低点.

一直困扰着我的问题,是否有可能从中挤出几个字节?对我的纯粹猜测给出了这些可能的线索:

>以某种方式使用’Hello,World’部分作为代码?
>任何人都知道一个可用的系统调用复活节彩蛋?
>欺骗链接器使入口点成为一个16位地址,以便可以使用movw $.L0,%cx(保存一个字节)?
>对已知(或通过汇编程序/链接器调用魔术创建)的位置执行8位偏移jmp,以包含退出(…)系统调用的必要指令,在xchg上保存一个字节; int序列?

或者,可以证明这实际上是最小的表现良好(没有崩溃/返回代码为零)linux / x86“Hello,World”?

编辑

澄清一下,问题不在于最小化ELF可执行文件的大小;这方面的技术是众所周知的.我明确询问linux 32位x86汇编程序的大小,该程序执行的编译代码与以下代码相同:

[+++]

会做.
事实上,我会对任何不需要手动编辑ELF标题的事情感到高兴.如果你找到了一种方法,例如将“Hello,World”填入某个ELF对象并从汇编源引用它,仅使用汇编程序/链接器命令行和/或mapfile输入,我认为它足够有效,即使这增加了它的大小ELF可执行文件.我只想知道打印“Hello,World”和exit()之后的指令序列是否可以缩小.
问题是关于代码大小,而不是可执行文件大小.

解决方法 这是在1999年完成的.看看 this page(剧透:最终结果是一个45字节的ELF文件).一定要阅读 the postscript. 总结

以上是内存溢出为你收集整理的这个Linux / 32bit x86组件“Hello,World”能否做得更小?全部内容,希望文章能够帮你解决这个Linux / 32bit x86组件“Hello,World”能否做得更小?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
这个Linux32bit x86组件“Hello,World”能否做得更小?_系统运维_内存溢出

这个Linux32bit x86组件“Hello,World”能否做得更小?

这个Linux32bit x86组件“Hello,World”能否做得更小?,第1张

概述以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0): .global _start ; notice on entry here, all regs but %esp are zero_start: call .L0 ; offset == strlen, provided by you 以下32位x86 Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0):

.global _start             ; notice on entry here,all regs but %esp are zero_start:    call  .L0              ; offset == strlen,provIDed by your assembler.byte 'H','e','l','o',',' ','W','r','d'.L0:    pop   %ecx             ; ret addr is starting addr of string    mov   -4(%ecx),%edx    ; argument to `call`,4 bytes: strlen    inc   %ebx             ; stdout == 1    movb  ,%al          ; SYS_write == 4    int   
.global _start_start:    movb  ,%al    inc   %ebx    mov   $.L0,%ecx       ; this address is calculated when linking    movb  $.Lend-.L0,%dl  ; strlen,calculated by assembler    int   
int main(int argc,char **argv){    puts("Hello,World");    exit(0); /* or whatever code */}
x80 xchg %eax,%ebx int %0x80.L0:.byte 'H','d'.Lend:
x80 xchg %eax,%ebp ; %ebp is still zero xchg %eax,%ebx ; SYS_exit == 1,return value == 0 int x80

如果一个人愿意牺牲位置独立性(相反,强制链接器插入字符串地址),而不关心程序返回零,可以将其归结为:

这两个都可以通过-32 -o x.o x.S组装/链接; ld -s -m elf_i386 x.o,运行得很好.第二个是26字节的代码.如果您在打印Hello,World之后允许崩溃,则将最后两条指令保留为23字节.那是我能走的最低点.

一直困扰着我的问题,是否有可能从中挤出几个字节?对我的纯粹猜测给出了这些可能的线索:

>以某种方式使用’Hello,World’部分作为代码?
>任何人都知道一个可用的系统调用复活节彩蛋?
>欺骗链接器使入口点成为一个16位地址,以便可以使用movw $.L0,%cx(保存一个字节)?
>对已知(或通过汇编程序/链接器调用魔术创建)的位置执行8位偏移jmp,以包含退出(…)系统调用的必要指令,在xchg上保存一个字节; int序列?

或者,可以证明这实际上是最小的表现良好(没有崩溃/返回代码为零)linux / x86“Hello,World”?

编辑

澄清一下,问题不在于最小化ELF可执行文件的大小;这方面的技术是众所周知的.我明确询问linux 32位x86汇编程序的大小,该程序执行的编译代码与以下代码相同:

会做.
事实上,我会对任何不需要手动编辑ELF标题的事情感到高兴.如果你找到了一种方法,例如将“Hello,World”填入某个ELF对象并从汇编源引用它,仅使用汇编程序/链接器命令行和/或mapfile输入,我认为它足够有效,即使这增加了它的大小ELF可执行文件.我只想知道打印“Hello,World”和exit()之后的指令序列是否可以缩小.
问题是关于代码大小,而不是可执行文件大小.

解决方法 这是在1999年完成的.看看 this page(剧透:最终结果是一个45字节的ELF文件).一定要阅读 the postscript. 总结

以上是内存溢出为你收集整理的这个Linux / 32bit x86组件“Hello,World”能否做得更小?全部内容,希望文章能够帮你解决这个Linux / 32bit x86组件“Hello,World”能否做得更小?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1032352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存